题解:P17746 「RSOI-1C」序列 / sequence
一个不用堆的做法
区间维护方式和铲雪一样,只是需要开一个新的数组
不过需要注意的是在减去过期区间之前可能会有失效的区间(即区间数
代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000010;
int n,k,a[N],b[N],c[N],ans=0;
signed main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
cin>>b[i];
if(a[i]>b[i]) //判无解
{
cout<<-1;
return 0;
}
}
int cur=0,dec=0;
for(int i=1;i<=n;i++)
{
if(i>k) //处理过期区间
{
if(dec>=c[i-k]) dec-=c[i-k];
else
{
cur-=c[i-k]-dec;
dec=0;
}
}
if(b[i]-a[i]>cur)
{
c[i]=b[i]-a[i]-cur; //记录区间起点数
cur=b[i]-a[i];
ans+=c[i];
}
else
{
dec+=cur-(b[i]-a[i]); //记录失效区间
cur=b[i]-a[i];
}
}
cout<<ans;
return 0;
}