首页 > 其他分享 >CF1572B. Xor of 3

CF1572B. Xor of 3

时间:2022-11-08 01:11:06浏览次数:39  
标签:Xor int printf back CF1572B 异或 ans include

题意

给出一个 \(01\) 序列,一次操作可以选择连续的三个数,把它们都变成三个数的异或和。问能否在 \(n\) 次以内全变成 \(0\),输出方案

题解

仔细研究发现,无论如何三个数的异或不会变,由此我们可以应该联想到前缀异或和, 同时如果所有异或和不为0, 无解。

然后, 假设我们操作的三个位置为\(i\), \(i+1\), \(i+2\), 设 \(s_i\) 表示前缀异或和。

那么可以发现操作等价于: \(s_i = s_{i+2}, s_{i+1} = s_{i-1}\)

显然, \(s_0 = 0,s_n = 0\), 所以如果当\(n\)为奇数时,一定有解。

当\(n\)为偶数时, 偶数位一定可以全为0, 我们可以优先找到一个奇数位\(0\), 找不到无解

找到之后向两边扩展即可。 本题不要求操作最少。

代码

点击查看代码
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <iostream>
const int N = 2e5;
using namespace std;
 
vector<int > ans;
 
int t, n, a[N + 5], s[N + 5];
 
int main() {
	// freopen("t.in", "r", stdin);
	// cout <<1  << endl;
	scanf("%d", &t);
	while(t--) {		
		scanf("%d", &n);
		for(int i = 1; i <= n; ++i) {
			scanf("%d", a + i);
			s[i] = s[i - 1] ^ a[i];
		} 
		if (s[n]) {
			puts("NO");
			continue;
		}
		if (n % 2) {
			puts("YES");
			printf("%d\n", n - 1);
			for(int i = 1; i < n; i += 2)
				printf("%d ", i);
			for(int i = n - 2; i >= 1; i -= 2)
				printf("%d ", i);
			puts("");
		}
		else {
			// cout << "ok" << endl;
			ans.clear();
			int pos = -1;
			for(int i = 1; i <= n; i += 2)
				if (s[i] == 0) {
					pos = i;
					break;
				}
			if (pos == -1) {
				puts("NO");
				continue;
			}
			for(int i = pos - 2; i >= 1; i -= 2)
				ans.push_back(i);
			for(int i = pos + 1; i < n; i += 2)
				ans.push_back(i);
			for(int i = 1; i < n - 1; i += 2) 
				ans.push_back(i);
			printf("YES\n%d\n", ans.size());
			for(int i = 0; i < ans.size(); ++i)
				printf("%d ", ans[i]);
			puts("");
		}
	}
	return 0;
}

标签:Xor,int,printf,back,CF1572B,异或,ans,include
From: https://www.cnblogs.com/absolutey/p/16868011.html

相关文章

  • Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round) F M
    A-E都还是比较简单的。首先,容易想到的,异或上\(2^k\),相当于以\(2^{k+1}\)的长度分块,然后每一块对半切,然后交换左右部分。我的想法是由于这个交换的性质,也许我们可以尝......
  • CF1743E FTL(哈希,DP)——关于 xorshift 的哈希冲突
    CF1743EFTL有两把laser枪,一把伤害\(p_0\)两发间隔时间至少\(t_0\),另一把\(p_1,t_1\)。打敌方太空船,血量\(N\)防御值\(s\),如果某个时刻你对太空船打出\(P\)的......
  • 【XSY3313】异或和(xorsum)(结论)
    先上一个结论。一个长度为\(n\)的\(01\)序列,其每个子序列的异或和的和为\([序列中包含1]2^{n-1}\)。证明:考虑若不存在\(1\),则显然。否则若存在\(1\),随便选一个......
  • 【CF888G】Xor-MST(01Trie,最小生成树)
    看到异或最值要么是线性基要么是01Trie。线性基显然可以排除。那么先把所有的\(a_i\)插入01Trie内。然后发现对于任意两个数\(a_i\)和\(a_j\):你发现它们在\(......
  • POJ 1222(Gauss消元xor版)
    EXTENDEDLIGHTSOUTDescriptionLightsOut就是下图的游戏,给你一个5*6的矩阵. 你的目标是把灯全关上. 0表示关,1表示开.Input第一行为数据......
  • ARC139F Many Xor Optimization Problems
    题意:给定\(n,m\),求\(n\)个\([0,2^m)\)的数的最大异或和的和。瞎扯:考虑线性基,考虑消元后的,显然唯一,最大异或和为基内所有数的异或和。考虑大小为\(k\)的基方案数为......
  • 【luogu AGC034F】RNG and XOR(FWT)
    RNGandXOR题目链接:luoguAGC034F题目大意给你一个长度为2^n的数组A。一开始有一个\(0\)数,然后每次你随机给它异或上0~2^n-1中的数,随机到\(i\)的概率跟Ai+1......
  • XOR-Hashing
    link一直没听说过这个玩意,做昨天牛客的时候想到异或的结论,但是就是卡在值冲突上了。收集一些例题:CF1175FCF869ECF1622FABC250E......
  • 2020辽宁省赛 xor(前缀和DP 异或性质)
    2020辽宁省赛xor题意:​ 现在有一个长度为n的数组a。现在要将a拆分成若干个连续的子数组,要求每个连续的数组异或和都为x。请问有多少种拆分的方案。思路:​ 容易推出转......
  • 「题解」Codeforces 1572B Xor of 3
    我知道你很急,但你先别急。我急了我急了我急了。如果直接上去莽构造的话,很可能就是像我一样大分讨的后果。先特判掉全是1,或者1的个数是奇数的情况。我的做法是考虑所......