对于奶牛L到r,要让奶牛L能看到R的话,就必须得[L+1,r-1]这段区间都要-1,差分数组维护就行。
假设A能看到B,此时修改的是区间【A+1,B-1】,我们不难证明如果下一次的L在【A+1,B-1】里面,那么R也必定在【A,B】里面,因此让[L+1,r-1]这段区间都要-1是最优,无论如果要么是无关的两个区间的更改,要么是区间套区间,不可能出现区间覆盖的情况。
同样需要去除掉一样的数据,比如多次输入同样的L和R这样区间就会一直减下去,结果会出错,所以用map记录一下就ok。
#include<iostream> #include<map> using namespace std; const int N=1e4+100; int d[N]; int n,i,h,m; map<int,int>mmap[N]; int main () { ios::sync_with_stdio(0); cin.tie(0); cin>>n>>i>>h>>m; int l,r; while(m--) { cin>>l>>r; if(mmap[l][r]==1) { continue; } mmap[l][r]=1; mmap[r][1]=1; if(l<r){ d[l+1]--; d[r]++; } else{ if(d[r+1]<0)continue; d[r+1]--; d[l]++; } } d[0]=h; for(int i=1;i<=n;i++) { d[i]=d[i-1]+d[i]; cout<<d[i]<<endl; } }