poj 3263 Tallest Cow

来源:互联网 发布:企业数据库er图 编辑:程序博客网 时间:2024/06/05 03:06

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

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

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

#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;}