[bzoj1635]最高的牛
初始如果没有限制,很显然每一头牛高度都是h
当只有一个限制,让h[a]到h[b]的高度都减1即可
容易发现两个限制不会相交(否则必然矛盾),只会包含或相离,因此没有影响,直接差分/线段树即可
(注意:1.不保证a<b;2.可能会有重复)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y; 5 }a[10005]; 6 int n,m,h,b[10005]; 7 bool cmp(ji x,ji y){ 8 return (x.x<y.x)||(x.x==y.x)&&(x.y<y.y); 9 } 10 int main(){ 11 scanf("%d%*d%d%d",&n,&h,&m); 12 for(int i=1;i<=m;i++){ 13 scanf("%d%d",&a[i].x,&a[i].y); 14 if (a[i].x>a[i].y)swap(a[i].x,a[i].y); 15 } 16 sort(a+1,a+m+1,cmp); 17 for(int i=1;i<=m;i++) 18 if ((a[i].x!=a[i-1].x)||(a[i].y!=a[i-1].y)){ 19 b[a[i].x+1]--; 20 b[a[i].y]++; 21 } 22 for(int i=1;i<=n;i++)printf("%d\n",h+=b[i]); 23 }