poj 2481(树状数组)

很难受,我好笨啊,啥都不会,这个题有点贪心的意思,重点在

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000+100;
struct note
{
    int l,r;
    int id;
    bool operator <(const note &p)
    {
        return (r>p.r)||(r==p.r&&l<p.l);//尾巴大的排在前面,尾巴相同,头小的排在前面
    }
}a[maxn];
int s[maxn],cnt[maxn];
int n;
void add(int x,int v)
{
    for(int i=x;i<=maxn;i+=i&-i)
        s[i]+=v;
}
int sum(int x)
{
    int ans=0;
    for(int i=x;i>0;i-=i&-i)
        ans+=s[i];
    return ans;
}
int main()
{
     while(~scanf("%d",&n)&&n)
     {
         memset(s,0,sizeof(s));
         memset(cnt,0,sizeof(cnt));
         for(int i=1;i<=n;i++)
         {
             scanf("%d%d",&a[i].l,&a[i].r);
             a[i].id=i;
         }
         sort(a+1,a+1+n);
         cnt[a[1].id]=0;
          add(a[1].l+1,1);
        for(int i=2;i<=n;i++)//第i个的r比前面小,所以如果第i个的l比前面的大,那么i就比前面的week
        {
            if(a[i].l==a[i-1].l&&a[i].r==a[i-1].r)
                cnt[a[i].id]=cnt[a[i-1].id];
            else
                 cnt[a[i].id]=sum(a[i].l+1);
            add(a[i].l+1,1);
        }
        for(int i=1;i<n;i++)
         printf("%d ",cnt[i]);
         printf("%d\n",cnt[n]);
     }
    return 0;
}

 

排序

posted on 2017-08-01 16:11  发牌员  阅读(111)  评论(0)    收藏  举报

导航