【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛

【题意】n头牛,其中最高h。给定r组关系a和b,要求满足h[b]>=h[a]且a、b之间都小于min(h[a],h[b]),求第i头牛可能的最高高度。

【算法】差分

【题解】容易发现r组关系只能包含或不相交

假设所有牛是最高高度

对于一组关系(a,b)显然只需要让区间[a+1,b-1]整体-1就好了。使用差分维护。

特别判断a=b和a=b+1和多区间LR一样的情况。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
const int maxn=10010;
int a[maxn],n,lll,h,m;
struct cyc{int l,r;}b[maxn];
bool cmp(cyc a,cyc b){return a.l<b.l||(a.l==b.l&&a.r<b.r);}
int read(){
    char c;int s=0,t=1;
    while(!isdigit(c=getchar()))if(c=='-')t=-1;
    do{s=s*10+c-'0';}while(isdigit(c=getchar()));
    return s*t;
}
int main(){
    n=read();lll=read();h=read();m=read();
    for(int i=1;i<=m;i++){
        b[i].l=read();b[i].r=read();
        if(b[i].l>b[i].r)swap(b[i].l,b[i].r);
    }
    sort(b+1,b+m+1,cmp);int tot=1;
    for(int i=2;i<=m;i++)if(b[i].l!=b[i-1].l||b[i].r!=b[i-1].r)b[++tot]=(cyc){b[i].l,b[i].r};
    m=tot;
    for(int i=1;i<=m;i++)if(b[i].l<b[i].r-1){
        a[b[i].l+1]--;a[b[i].r]++;
    }
    for(int i=1;i<=n;i++)printf("%d\n",h+=a[i]);
    return 0;
}
View Code

 

posted @ 2017-10-12 17:04  ONION_CYC  阅读(284)  评论(0编辑  收藏  举报