我是靠谱客的博主 正直板栗,最近开发中收集的这篇文章主要介绍【学习笔记】[AGC040E] Prefix Suffix Addition,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先对贡献进行一个基本的转化,设 A i = B i + C i A_i=B_i+C_i Ai=Bi+Ci,答案是 ∑ [ B i > B i + 1 ] + ∑ [ C i < C i + 1 ] sum [B_i>B_{i+1}]+sum [C_i<C_{i+1}] [Bi>Bi+1]+[Ci<Ci+1]

d p i , j dp_{i,j} dpi,j表示 B i = j B_i=j Bi=j时的最小代价,我们从两个角度压缩状态。

1.1 1.1 1.1 ∣ d p i , 0 − d p i , A i ∣ ≤ 2 |dp_{i,0}-dp_{i,A_i}|le 2 dpi,0dpi,Ai2 ,显然,因为这一步最多产生 2 2 2的贡献,也就是说值域是稠密的。
1.2 1.2 1.2 d p i , j dp_{i,j} dpi,j单调递减。

上述性质不难通过打表看出。并且 j j j固定时, k k k越大,转移代价越大,所以我们大力维护这个分段函数即可。

复杂度 O ( n ) O(n) O(n)。注意如果 B B B的后缀是 0 0 0或者 C C C的前缀是 0 0 0时会多算贡献,需要处理一下边界。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[200005];
int x,y,dp;
signed main(){
	cin>>n;for(int i=1;i<=n;i++)cin>>a[i];
	y=a[1];
	for(int i=2;i<=n;i++){
		int l1=max(y,a[i]-a[i-1]+y); // 代价为0 
		int l2=min(y,a[i]-a[i-1]+y); // 代价为1
		int l3=max(x,a[i]-a[i-1]+x),l4=min(y-1,a[i]-a[i-1]+y-1);
		int X=0,Y=0;
		if(l1>a[i]){
			dp++,Y=l2;
			if(l3<=l4)Y=l3;
		}
		else {
			Y=l1,X=l2;
			if(l3<=l4)X=l3;
		}
		x=max(X,0),y=max(Y,0);
	}if(y==0)dp--;
	cout<<dp+1;
}

最后

以上就是正直板栗为你收集整理的【学习笔记】[AGC040E] Prefix Suffix Addition的全部内容,希望文章能够帮你解决【学习笔记】[AGC040E] Prefix Suffix Addition所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部