"蔚来杯"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;
}