首页 > 其他 > 详细

CF808D Solution

时间:2021-03-11 22:25:34      阅读:27      评论:0      收藏:0      [点我收藏+]

题目链接

题解

可以发现,将\(a_i\)\(A\)移动至\(B\)段(\(A,B\)为前缀、后缀)产生的结果为\(sum(B)-sum(A)+=2\cdot a_i\),而最终状态应为\(|sum(B)-sum(A)|=0\)。因此我们可以枚举\(a_i\),及其所在段(\(A/B\))。当\(a_i\)\(B\)中时,使用map维护\(A\)的最后一个元素取\([a_1,a_{i-1}]\)时的\(sum(A)-sum(B)\)值,如果存在该值\(=-2\cdot a_i\)则判断可行。\(a_i\)\(A\)中时则维护的第一个元素取\([a_{i+1},a_n]\)时的\(sum(B)-sum(A)\)值。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],sum1[N],sum2[N];
map<int,bool> mp;
signed main()
{
	int n;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) {scanf("%lld",&a[i]); sum1[i]=sum1[i-1]+a[i];}
	for(int i=n;i>=1;i--) sum2[i]=sum2[i+1]+a[i];
	for(int i=0;i<=n;i++)
	{
		if(mp[-2*a[i]]) {printf("YES"); return 0;}
		mp[sum1[i]-sum2[i+1]]=1;
	}
	mp.clear();
	for(int i=n+1;i>=1;i--)
	{
		if(mp[-2*a[i]]) {printf("YES"); return 0;}
		mp[sum2[i]-sum1[i-1]]=1;
	}
	printf("NO");
	return 0;
} 

CF808D Solution

原文:https://www.cnblogs.com/violetholmes/p/14520006.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!