题意就是给你一个序列,原始本身都是0,第一个只能往后,最后一个只能向前,往后走就+1,向前走就-1,还要保证最后的指针停在第一个元素上,问你可不可能获得序列a
这题我明白了之后又开心又懊恼,为什么这么简单自己一开始没想到,开心的是这个题方法有点巧妙,我应该是能想到的呀
注意一下:这个题往后要+1,往前要-1,还要返回到元素1,所以一部分抵消了的,我说不清楚了呢,推一位大佬的链接
Codeforces Round #800 (Div. 2) A - D - 知乎 (zhihu.com)
讲的超级清楚呢,一下子就明白了,前后是守恒的,前缀已经变成0了,那直接保证指针在第一位就好了,不然后面再继续会破坏掉前面的守恒,这点要注意,刚刚我自己重新写一遍的时候忘记了,有个样例过不去QAQ
其他的没啥了
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N],s[N];
int main(){
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int x=n+1,f=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
// cout<<a[i]<<" "<<f<<" "<<x<<endl;
if(i>x)
{
if(a[i]!=0) f=0;
}
if(a[i]<0) f=0;
if(a[i]==0)
{
x=i;
}
}
if(!f) cout<<"NO"<<"\n";
else
{
if(!a[n]) cout<<"YES"<<"\n";
else cout<<"NO"<<"\n";
}
}
return 0;
}