思路:先对E进行降序排序,在E相等的情况下,对S进行升序排序。然后用树状数组统计即可
#include#include 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.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