POJ24810 - Cows

题目大意

给定N对二元组(s,e),对于第i对二元组(s[i],e[i]),在前1~i-1对二元组中计算出符合这样要求的二元组(s[j],e[j])的总数量,s[j]<=s[i],e[j]>=e[i],并且e[j]-s[j]>e[i]-s[i]。

题解

先按e降序排序,如果e相等则按s升序排序,这样处理之后,接下来就和POJ2352的stars的处理是一样的,对于第i个数,只要小于a[i].s的数都是符合要求的。

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

#define MAXN 100005

using namespace std;

typedef struct

{

    int x;

    int y;

    int id;

} NODE;

NODE a[MAXN];

int c[MAXN],f[MAXN];

int n;

int lowbit(int x)

{

    return x&-x;

}

int sum(int x)

{

    int ret=0;

    while(x>0)

    {

        ret+=c[x];

        x-=lowbit(x);

    }

    return ret;

}

void add(int x)

{

    while(x<=MAXN)

    {

        c[x]++;

        x+=lowbit(x);

    }



}

bool cmp(NODE a,NODE b)

{

    if(a.y==b.y)

        return a.x<b.x;

    return a.y>b.y;

}

int main(void)

{

    int i,n,ans;

    while(scanf("%d",&n)!=EOF&&n)

    {

        memset(c,0,sizeof(c));

        for(i=1; i<=n; i++)

        {

            scanf("%d%d",&a[i].x,&a[i].y);

            a[i].x++;

            a[i].y++;

            a[i].id=i;

        }

        sort(a+1,a+n+1,cmp);

        for(i=1;i<=n;i++)

        cout<<a[i].x<<' '<<a[i].y<<endl;

        for(i=1; i<=n; i++)

            if(i>1&&a[i].x==a[i-1].x&&a[i].y==a[i-1].y)

            {

                f[a[i].id]=ans;

                add(a[i].x);



            }

            else

            {

                ans=sum(a[i].x);

                f[a[i].id]=ans;

                add(a[i].x);

            }

        for(i=1; i<n; i++)

            printf("%d ",f[i]);

        printf("%d\n",f[i]);

    }

}

你可能感兴趣的:(poj)