题意:n个奶牛,最高的奶牛i高h,有m对约束,每个约束x,y表示x+1~y-1所有的奶牛都要比x和y奶牛要矮,求所有奶牛的最大身高
分析:
首先肯定先把所有奶牛的H设为h
对于第一条约束来说,显然只需要把H[x+1]~H[y-1]全部减一即可
那么对于第二条约束来说,如果这条约束与第一条不相交,显然与第一条的处理方法是一样的
那么如果与第一条约束相交会怎么样呢?
这里可能就有很多人想不明白了
其实,他们不可能相交,只可能会包含,
因为显然,如果两个约束相交一定是不符合题意的,
比如x2<x1<y2<y1
显然第一条规定使得H[y2]<x1,y1
而第二条规定使得H[x1]<x2,y2
显然矛盾
那么包含的时候如何处理呢?
显然也是和第一条处理方法是一样的
而这个处理方法是区间都减一
显然可以用差分
还有一个小细节就是约束可能重复,所以还需要用map去一下重
代码:
#include<cstdio> #include<algorithm> #include<map> using namespace std; const int maxn=2e4+1; int a[maxn]; map<pair<int,int>,bool> mapp; int main() { int n,p,h,m,x,y; scanf("%d%d%d%d",&n,&p,&h,&m); while(m--) { scanf("%d%d",&x,&y); if(x>y) swap(x,y); if(mapp[make_pair(x,y)]) continue; mapp[make_pair(x,y)]=1; a[x+1]--;a[y]++; } for(int i=1;i<=n;i++) a[i]+=a[i-1],printf("%d ",a[i]+h); return 0; }