对于奶牛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;
    }
}