POJ 2481
2012-08-09 14:59
197 查看
一道树状数组的应用题,和POJ 3067非常类似,这道题是求比自己强壮(e更大,s更小)的牛的数量。
将POJ 3067的思路应用到这道题上,如果先对e按照降序排列,每加入一只牛,当前已经加入树状数组的牛的s如果比这只牛小,那么那些牛就更强壮,所以同样是在树状数组里的求和问题。同样,对s的排序规则关系到e相同时的情况,由于s更小就更强壮,所以先把s小的加入,于是s就按照升序排列。再考虑e和s都相同的情况,假设有一些牛的e和s都相同,为cow1,cow2.....,cowK,那么更强壮的牛的数量x,满足cow1=cow2=....=cowK=x。所以遇到e和s都相同的状况时,只需要复制答案就可以了。
另外,由于排序后,顺序和开始给出数据时的顺序不同,所以需要记录一下开始给出数据时的顺序。
将POJ 3067的思路应用到这道题上,如果先对e按照降序排列,每加入一只牛,当前已经加入树状数组的牛的s如果比这只牛小,那么那些牛就更强壮,所以同样是在树状数组里的求和问题。同样,对s的排序规则关系到e相同时的情况,由于s更小就更强壮,所以先把s小的加入,于是s就按照升序排列。再考虑e和s都相同的情况,假设有一些牛的e和s都相同,为cow1,cow2.....,cowK,那么更强壮的牛的数量x,满足cow1=cow2=....=cowK=x。所以遇到e和s都相同的状况时,只需要复制答案就可以了。
另外,由于排序后,顺序和开始给出数据时的顺序不同,所以需要记录一下开始给出数据时的顺序。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_COW 100005 struct node { int s; int e; int order; }cow[MAX_COW]; int c[MAX_COW],ans[MAX_COW]; int cmp(const void *,const void *); inline lowbit(int); int get_sum(int); void update(int,int); int main() { int n; while(scanf("%d",&n)!=EOF&&n!=0) { int i; for(i=1;i<=n;i++) { scanf("%d%d",&cow[i].s,&cow[i].e); cow[i].s+=1;cow[i].e+=1; cow[i].order=i; } qsort(&cow[1],n,sizeof(struct node),cmp); memset(c,0,sizeof(c)); memset(ans,0,sizeof(ans)); ans[cow[1].order]=0; update(cow[1].s,1); for(i=2;i<=n;i++) { if(cow[i].e==cow[i-1].e&&cow[i].s==cow[i-1].s) { ans[cow[i].order]=ans[cow[i-1].order]; } else { ans[cow[i].order]=get_sum(cow[i].s); } update(cow[i].s,1); } for(i=1;i<n;i++) printf("%d ",ans[i]); printf("%d\n",ans[i]); } return 0; } int cmp(const void *x,const void *y) { if((*(struct node *)x).e-(*(struct node *)y).e!=0) { return (*(struct node *)y).e-(*(struct node *)x).e; } return (*(struct node *)x).s-(*(struct node *)y).s; } inline int lowbit(int x) { return x&(-x); } int get_sum(int x) { int i,sum=0; for(i=x;i>0;i-=lowbit(i)) { sum+=c[i]; } return sum; } void update(int x,int val) { int i; for(i=x;i<MAX_COW;i+=lowbit(i)) { c[i]+=val; } }
相关文章推荐
- POJ 2481 Cows 线段树
- poj 2481 cows 树状数组 老少皆宜版解答
- POJ 2481 Cows
- poj 2481 Cows
- POJ2481 Cows 树状数组
- POJ 2481
- 树状数组——POJ 2481
- POJ-2481-树状数组
- poj 2481
- Cows POJ - 2481
- POJ 2481 Cows【树状数组】
- POJ 题目2481 Cows(树状数组)
- poj 2481 Cows(树状数组)
- poj 2481 树状数组
- poj2481--Cows
- POJ 2481 Cows
- 树状数组 之 poj 2481
- POJ 2481 Cows (树状数组)
- poj 2481 树状数组
- poj 2481 Cows(线段树)