题意:对于每头牛,吃草的区间在li,ri之间,问在n头牛中,对于第i头牛而言,有几头牛的区间大于这头牛。
先按ri排序(固定一个方向),再用树状数组对li即可。
代码:
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; const int max_n=1e5+5; struct node { int l,r,id; } a[max_n]; int bit[max_n]; int ans[max_n]; int n,maxr; bool cmp(node a,node b) { if(a.r!=b.r) return a.r>b.r; return a.l<b.l; } int sum(int x) { int ret = 0; while(x>0) { ret+=bit[x]; x-=x&-x; } return ret; } void add(int x,int d) { while(x<=maxr+1) { bit[x]+=d; x+=x&-x; } } int main() { int l,r; while(scanf("%d",&n),n) { memset(ans,0,sizeof(ans)); memset(bit,0,sizeof(bit)); maxr = -1; for(int i = 1; i<=n; i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].id = i; maxr = max(maxr,a[i].r); } sort(a+1,a+1+n,cmp); for(int i = 1; i<=n; i++) { if(a[i].l == a[i-1].l && a[i].r == a[i-1].r)//题目要求大于此区间的 { ans[a[i].id] = ans[a[i-1].id]; } else { ans[a[i].id] = sum(a[i].l+1); } add(a[i].l+1,1); } for(int i = 1; i<=n; i++) printf("%d%c",ans[i],(i==n)?'\n':' '); } return 0; }