poj2481

给定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;
}
View Code
原文地址:https://www.cnblogs.com/Kong-Ruo/p/7762269.html