poj_2481,Cows,树状数组
2014-09-09 21:19
260 查看
将e按从大到小排序,统计前i-1个中比
e小的个数,注意相等的情况
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Item { int s; int e; int x; }; int n; Item item[500010]; int a[500010],b[500010]; int lowbit(int x) { return x&(-x); } int sum(int x) { int ret=0; while(x>0) { ret=ret+a[x]; x-=lowbit(x); } return ret; } void add(int x,int d) { while(x<500001) { a[x]+=d; x+=lowbit(x); } } bool cmp(Item a,Item b) { return a.e>b.e||((a.e==b.e)&&(a.s<b.s)); } int main() { while(scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); for(int i=0;i<n;i++) { scanf("%d%d",&item[i].s,&item[i].e); item[i].s++,item[i].e++; item[i].x=i; } sort(item,item+n,cmp); b[item[0].x]=sum(item[0].s); add(item[0].s,1); for(int i=1;i<n;i++) { if(item[i].e==item[i-1].e&&item[i].s==item[i-1].s) { b[item[i].x]=b[item[i-1].x]; add(item[i].s,1); } else{ b[item[i].x]=sum(item[i].s); add(item[i].s,1); } } for(int i=0;i<n;i++) cout<<b[i]<<" "; cout<<endl; } return 0; }
e小的个数,注意相等的情况
相关文章推荐
- 树状数组 POJ 2481 Cows
- poj 2481 Cows(哇咔咔,树状数组^ ^)
- POJ-2481 Cows 树状数组
- POJ 2481:Cows 树状数组
- POJ 2481 Cows (线段树||树状数组)
- (POJ 2481)Cows 树状数组
- POJ 2481:Cows 树状数组
- poj_2481,Cows,树状数组
- POJ 2481 cows 树状数组
- POJ 2352_Stars && POJ-2481 Cows (线段树单点更新+树状数组)
- poj 2481 cows 树状数组
- POJ 2481 Cows 树状数组
- poj2352+2481 stars+cows 树状数组
- POJ2481 Cows 树状数组
- poj 2481 cows 树状数组
- 树状数组 POJ 2481 Cows
- POJ(2481)Cows 树状数组
- POJ 2481 Cows 树状数组
- POJ 2481 - Cows 树状数组离线处理
- POJ 2481 Cows 树状数组