poj 3263 Tallest Cow

一个压了很久的题目,确实很难想,看了别人的做法后总算明白了。

首先要明白一点,因为题目说明了不会有矛盾,所以题目给出来的区间是不能相交的,否则是矛盾的。(原因自己想)

然后既然区间只能是包含的,就很明显了,一个数被包含了几次它就要比最高的牛矮多少。

 

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

const int maxn=1e4+9;

struct D

{

    int l,r;

    bool operator <(const struct D & xx) const

    {

        if(l==xx.l)

        return r<xx.r;

        return l<xx.l;

    }

}qry[maxn];

int dp[maxn];

int main()

{

    int n,m,h,r;

    scanf("%d %d %d %d",&n,&m,&h,&r);

    for(int i=1;i<=r;i++)

    {

        scanf("%d %d",&qry[i].l,&qry[i].r);

        if(qry[i].l>qry[i].r)

        swap(qry[i].l,qry[i].r);

    }

    sort(qry+1,qry+1+r);

    qry[0].l=0;

    for(int i=1;i<=r;i++)

    {

        if(qry[i].l==qry[i-1].l&&qry[i].r==qry[i-1].r)

        continue;

        dp[qry[i].l+1]--;

        dp[qry[i].r]++;

    }

    int ret=0;

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

    {

        ret+=dp[i];

        printf("%d\n",ret+h);

    }

    return 0;

}


 

 

你可能感兴趣的:(poj)