您的位置:首页 > 其它

POJ 2481 树状数组

2011-08-10 20:32 127 查看
题意:有n只奶牛,每一只有自己的强度,用闭区间 [ l, r ] 表示, 若有两只奶牛,强度分别为 A = [ a, b ], B = [ c, d ],当c <= a  且 b <= d 且 b-a != d-c 时, 说牛B比牛A强。对于每一头奶牛,求比它强的奶牛数。

题解:注意排序的选择,选s还是t,升序还是降序,都有影响,要保持树状数组的性质,更新时最好向上,求和时最好向下。

另外,将这题的左右区间变成坐标的话,有点类似stars那题。

#include <iostream>
using namespace std;

#define N 100005
int c
, num
, n;

struct item
{
int s, t, id;
} node
;

int cmp ( const void* a, const void* b )
{
item* first = (item*)a;
item* second = (item*)b;
if ( first->t == second->t )  /* t降序,t相同时s升序。当然换一种方式也可以对先对s排序,具体讨论 */
return first->s - second->s;
return second->t - first->t;
}

int lowbit ( int x )
{
return x & ( -x );
}

void update ( int x )
{
for ( int i = x; i <= N; i += lowbit(i) )
c[i]++;
}

int getSum ( int x )
{
int sum = 0;
for ( int i = x; i > 0; i -= lowbit(i) )
sum += c[i];
return sum;
}

int main()
{
int l, r, i;
while ( scanf("%d",&n) && n )
{
memset(c,0,sizeof(c));
for ( i = 1; i <= n; ++i )
{
scanf("%d%d",&l, &r);
node[i].s = l + 1;
node[i].t = r + 1;
node[i].id = i;
}
qsort(node+1,n,sizeof(item),cmp);

for ( i = 1; i <= n; ++i )
{
if ( node[i].s == node[i-1].s && node[i].t == node[i-1].t ) /* 相同处理 */
{
update ( node[i].s );
num [ node[i].id ] = num [ node[i-1].id ];
continue;
}
else
{
num[ node[i].id ] = getSum ( node[i].s );
update ( node[i].s );
}
}

for ( i = 1; i < n; ++i )
printf("%d ", num[i]);
printf("%d\n",num[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c