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那题。
题解:注意排序的选择,选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; }
相关文章推荐
- poj2352+2481 stars+cows 树状数组
- POJ 2481 树状数组
- poj 2481 Cows 树状数组
- poj 2481 cows 树状数组
- POJ 2481 cows 树状数组
- poj 2481 树状数组
- POJ 2352_Stars && POJ-2481 Cows (线段树单点更新+树状数组)
- POJ 2481 Cows 树状数组
- POJ-2481 Cows 树状数组
- poj 2481 树状数组
- POJ 2481 Cows (线段树||树状数组)
- poj_2481,Cows,树状数组
- POJ 2481 Cows 树状数组
- 树状数组 POJ 2481 Cows
- 树状数组 POJ 2481 Cows
- poj2481-树状数组的应用
- poj 2481 树状数组
- POJ 2481 树状数组
- poj2481 树状数组
- POJ2481 Cows 树状数组