poj2481 Cows
阿新 • • 發佈:2020-09-12
題目連結:https://vjudge.net/problem/POJ-2481
題意:給定一些區間,問對於每個區間,有多少個其他區間把它包含(兩個完全相同的區間不算)
對左端點排序,然後對右端點用求逆序對的方法,順著掃一遍記錄左邊有多少個右端點大於等於它就可以了。一個坑點就是區間完全相同的情況
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=1e5; struct st{int l,r,pos;}a[N+10]; int c[N+10],ans[N+10],n,i,j,k; bool cmp(st p,st q){return (p.l==q.l)?p.r>q.r:p.l<q.l;} //* void add(int x,int y){ for (int i=x;i<=N;i+=i&(-i)) c[i]+=y; } int ask(int x){ int res=0; for (int i=x;i>0;i-=i&(-i)) res+=c[i]; return res; } int main(){ while (scanf("%d",&n)){ if (n==0) break; memset(c,0,sizeof(c)); for (i=1;i<=n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].pos=i; } sort(a+1,a+n+1,cmp); for (i=1;i<=n;i++){ int j=i; while (a[j].l==a[j-1].l&&a[j].r==a[j-1].r) j--; ans[a[i].pos]=ask(N)-ask(a[i].r-1)-(i-j); add(a[i].r,1); } for (i=1;i<=n-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); } return 0; }