码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2481 cows

时间:2017-07-23 10:12:03      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:scan   cto   ide   vector   技术   color   ==   int   cow   

题目大意:

有一些集合,求每个集合是多少个集合的真子集

思路:

树状数组

先按照右端点从大到小排序,这样只要考虑之前比它左端点小的出现过几次就可以了

模板题

 

技术分享
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
int n,c[101010],ans[101010],maxn;
struct data
{
    int s,e,num;
    bool operator < (const data &a) const
    {
        if(e==a.e) return s<a.s;
        return e>a.e;
    }
}inv[101010];
int lowbit(int x){return x&(-x);}
void add(int i) { while(i<=maxn) {c[i]++;i+=lowbit(i);} }
int sum(int i)
{
    int a=0;
    while(i>0) {a+=c[i];i-=lowbit(i);}
    return a;
}
int main()
{
    while(scanf("%d",&n)&&n!=0)
    {
        memset(c,0,sizeof(c));
        maxn=-1;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&inv[i].s,&inv[i].e);
            inv[i].s++,inv[i].e++;
            inv[i].num=i;
            maxn=max(maxn,inv[i].e);
        }
        sort(inv+1,inv+n+1);
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(inv[i].e==inv[i-1].e&&inv[i].s==inv[i-1].s) cnt++;
            else cnt=0;
            ans[inv[i].num]=sum(inv[i].s)-cnt;
            add(inv[i].s);
        }
        for(int i=1;i<=n;i++) printf("%d ",ans[i]);
        printf("\n");
    }
}
View Code

 

poj 2481 cows

标签:scan   cto   ide   vector   技术   color   ==   int   cow   

原文地址:http://www.cnblogs.com/yyc-jack-0920/p/7223600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!