题目:
见https://www.luogu.com.cn/problem/P5019
思路:
这题可以用贪心也可以用分冶(在洛谷看到好多方法),但是我还是选择了一个大佬的差分,其实差分分冶我都想到了,可是好像不大会用代码实现,而且这题用差分做,和之前我做过的一道差分题的思路一模一样.还是太菜了。。。
搬自:https://www.luogu.com.cn/blog/OnePunchManGO/solution-p5019
我们统计一个差分数组,cf[i]=d[i]-d[i-1].
特别的,cf[0]=0.
我们只需要像RMQ那样区间修改即可,修改i–j区间(都减1),只需把cf[i]-1,cf[j+1]+1就可以了,为了得到最优解,cf[i]要为正数,cf[j+1]要为负数,最后一正一负 配对为min(sum(正数),abs(sum(负数)))即可,还有剩下的正(负)数,即为abs(sum(正数)-abs(sum(负数))),so最后的答案为min(sum(正数),abs(sum(负数)))+abs(sum(正数)-abs(sum(负数)))=max(sum(正数),abs(sum(负数));
代码:
#include<iostream>
using namespace std;
const int N=100010;
int a[N],d[N];
int main()
{
int n;
cin>>n;
int sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
d[i]=a[i]-a[i-1];
}
for(int i=1;i<=n;i++)
{
if(d[i]<0) sum1-=d[i];
else if(d[i]>0) sum2+=d[i];
}
cout<<max(sum1,sum2)<<endl;
return 0;
}
洛谷P5019差分算法解析
本文详细解析洛谷P5019题目,并采用差分算法求解,通过构建差分数组cf[i]=d[i]-d[i-1],实现了区间修改,最终得出最优解的方法为max(sum(正数),abs(sum(负数))。
626

被折叠的 条评论
为什么被折叠?



