CF1572B Xor of 3 题解

题目链接

点击打开链接

题目解法

构造题会不了一点(其实胡了一个做法,但要 \(\frac{3}{2}n\) 步)
显然异或和 \(=1\) 无解
\(s_i\)\(a_i\) 的异或前缀和
考虑操作 \(x,x+1,x+2\) 的变化,手推一下发现 \(s_{x}\Leftarrow s_{x+2},\;s_{x+1}\Leftarrow s_{x-1}\)
显然下标为奇数的,只要从后往前推一遍就可以了
下标为偶数的,在中间找到任意一个 \(s_i=0(i\in even)\),往前推一遍,往后推一遍即可

时间复杂度 \(O(n)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=200100;
int a[N];
void work(){
    int n=read();
    F(i,1,n) a[i]=read(),a[i]^=a[i-1];
    if(a[n]){ puts("NO");return;}
    int cho=-1;
    F(i,1,n) if((i&1)&&!a[i]){ cho=i;break;}
    if(cho==-1){ puts("NO");return;}
    vector<int> ans;
    for(int i=cho-2;i>=1;i-=2) ans.pb(i);
    for(int i=cho+2;i<n;i+=2) ans.pb(i-1);
    for(int i=2;i<n;i+=2) ans.pb(i-1);
    puts("YES");printf("%d\n",(int)ans.size());
    for(int x:ans) printf("%d ",x);puts("");
}
int main(){
    int T=read();
    while(T--) work();
    return 0;
}

posted @ 2024-02-02 14:36  Farmer_D  阅读(13)  评论(0)    收藏  举报