poj2481
http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10588
思路:先对E进行降序排序,在E相等的情况下,对S进行升序排序。然后用树状数组统计即可
#include<iostream> #include<algorithm> using namespace std; struct node { int s,e,k; }t[100005]; int c[100005]; int cmp(const node &a,const node &b) { if(b.e<a.e) return 1; else if(b.e==a.e&&b.s>a.s) return 1; else return 0; } int lowbit(int x) { return x&(-x); } int sum(int x) { int s=0; while(x>0) { s+=c[x]; x-=lowbit(x); } return s; } void updata(int i,int j) { while(i<=100004) { c[i]+=j; i+=lowbit(i); } } int main() { int i,rel[100005],n; while(scanf("%d",&n)>0) { if(n<1) break; memset(c,0,sizeof(c)); for(i=1;i<=n;i++) { scanf("%d %d",&t[i].s,&t[i].e); t[i].s++,t[i].e++; t[i].k=i; } sort(t+1,t+1+n,cmp); i=1; rel[t[i].k]=sum(t[i].s); updata(t[i].s,1); for(i=2;i<=n;i++) { if(t[i].s==t[i-1].s&&t[i].e==t[i-1].e) rel[t[i].k]=rel[t[i-1].k]; else rel[t[i].k]=sum(t[i].s); updata(t[i].s,1); } for(i=1;i<n;i++) printf("%d ",rel[i]); printf("%d\n",rel[i]); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。