给定n个集合 输出每个集合是多少集合的子集
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<stack> #define lowbit(x) x&(-x) using namespace std; struct p { int x,y,rank; }sts[151000]; int c[151000],MAXN; bool cmp(p b,p a) { if(b.y==a.y)return b.x<a.x; return b.y>a.y; } inline int sum(int x) { int res=0; for(int i=x;i>=1;i-=lowbit(i))res+=c[i]; return res; } inline void add(int x) { for(int i=x;i<=MAXN;i+=lowbit(i))c[i]++; } int ans[151000]; int main() { int n; while(~scanf("%d",&n) && n) { memset(c,0,sizeof(c)); memset(ans,0,sizeof(ans)); MAXN=-1; for(int i=1;i<=n;i++) { scanf("%d%d",&sts[i].x,&sts[i].y); sts[i].x++,sts[i].y++; MAXN=max(MAXN,max(sts[i].x,sts[i].y)); sts[i].rank=i; } sort(sts+1,sts+n+1,cmp); int cnt=0; for(int i=1;i<=n;i++) { if(sts[i].x==sts[i-1].x && sts[i].y==sts[i-1].y)cnt++; else cnt=0; ans[sts[i].rank]=sum(sts[i].x)-cnt; add(sts[i].x); } for(int i=1;i<=n;i++)printf("%d ",ans[i]); printf(" "); } return 0; }