"蔚来杯"2022牛客暑期多校训练营(加赛)部分题题解

J Jellyfish and its dream

不得不吹嘘下队友,真的是不会做也能弄出来,太牛了。
这个题怎么说呢,有思路后就很简单,但这个思路确实也不是太好想...
考虑每个数都是和右边的作比较,之后做变化.
那么既然只和右边的相关,我们就可以做差分。
将原本的序列变成差分序列,这样的话,考虑原序列的变化在差分上是怎样的变化。
经过讨论可以发现,对于第一项,如果是1,可以变成0.
之后的其余项,发现如下变化:
(2,1)->(0,0) (1,1)->(2,0) (0,1)->(1,0)
通过第三个操作,可以将0,1交换位置。2和1可以抵消,但2得在1的左边。所以先考虑2,假若我们把2给除完了,只剩0和1是完全可以的,我们可以通过0和1的交换,将1交换到第一个位置,变成0即可。所以只要我们将2除完即可。
发现(1,1)->(2,0)是没有意义的,所以我们只统计2后面1的个数即可。
但由于这是一个环,只要有1有2,我们总能让他们在一起,所以只需要统计2,1的个数,之后判断多余的1能否自行解决即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int T,n,a[N],c[N]; 
int main()
{
//	freopen("1.in","r",stdin);
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;++i)  scanf("%d",&a[i]);
		for(int i=1;i<n;++i) c[i]=(a[i+1]-a[i]+3)%3;
		c[n]=(a[1]-a[n]+3)%3;
		int cnt1=0,cnt2=0;
		for(int i=1;i<=n;++i)
		{
			if(c[i]==2) cnt2++;
			if(c[i]==1) cnt1++;
		}
		if(cnt1>=cnt2&&(cnt1-cnt2)%3==0) puts("Yes");
		else puts("No");
	}
	return 0;
}
posted @ 2022-08-18 10:10  逆天峰  阅读(45)  评论(0编辑  收藏  举报
作者:逆天峰
出处:https://www.cnblogs.com/gcfer//