模拟想要解开谜题时的操作即可,

先看总元素量,如果他不能被n块方碑平分,那么它一定是无解的。

对于能够平分的情况:

从左往右依次处理元素方碑

对于第i块方碑(i<n-2),对他的操作有3种情况:

1.a[i]==p(平均元素量),不做任何操作

2.a[i]<p,应该反面轰击第i+1块方碑,让a[i+2]中的元素流到第i块方碑,直到元素量和p相同

3.a[i]>p,应该正面轰击第i+1块方碑,让第i块元素方碑的元素流向第i+2块元素方碑中,

这样到最后就只会剩下最后两个方碑,前面的方碑全部都是处理好的,如果这两个元素方碑的元素量都是p,就能排序好,输出YES,否则输出NO

#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n;
    cin>>n;
    vector<int>s(n);
    long long sum=0;
    for(int i=0;i<n;i++){
        cin>>s[i];
        sum+=s[i];
    }
    if(sum%n!=0){//当元素量不能被平分的时候
        cout<<"NO"<<endl;
        return;
    }
    int p = sum/n;
    for(int i=0;i<n;i++){//依次处理元素方碑的元素
        if(s[i]<p && i+2<n){
            s[i+2] -= p-s[i];
        }else if(s[i]>p && i+2<n){
            s[i+2] += s[i] - p;
        }else if(i+2==n){//判断最后两个元素方碑的元素量
            if(s[i]!=p || s[i+1]!=p){
                cout<<"NO"<<endl;
                return;
            }
        }
    }
    cout<<"YES"<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}