ARC145E 做题记录

link

超棒的题目。

考虑到差分的性质不够好,转化为将 b 做若干次前缀异或操作变为 a。前缀和只会影响一段前缀的值,所以考虑逐个确定 bn1,变为 a

枚举 i 表示当前需要还原 bi。只有对 k=i 操作才能改变 bi。不妨设 sumb1...i1 的异或和,我们最终会令 bibisum,即目标为把 sumaibi 变成 0

一个高妙的处理:考虑找出 b1...i1 的一组线性基,当 sum 不能被组合出来时无解。随后,设 c1...i1b1...i1 的线性基表示,xaibisum 的表示。

对于线性基的每一个二进制元素,设其在 b 中第一次出现的位置为 pos,我们倒序枚举这些 pos,如果 x 在对应位为 1,那么我们进行一次 k=pos+1 操作即可。正确性显然,sum 一定会在对应位取反,并且后续操作不会改变这一位,因为该位是第一次出现。

  • 启示:逆操作的转化;线性基,将每一位转化为每一个空间维度
点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define mkp make_pair
#define pir pair <ll, ll>
#define pb emplace_back
#define i128 __int128
void rd(ll &x) {
	char ch;
	while(!isdigit(ch = getchar())) ;
	x = ch - '0';
	while(isdigit(ch = getchar()))
		x = (x << 1) + (x << 3) + ch - '0';
}
using namespace std;
const ll maxn = 1010;
ll d[maxn], pos[maxn], n, a[maxn], b[maxn], c[maxn];
vector <ll> res;
int main() {
	scanf("%lld", &n);
	for(ll i = 1; i <= n; i++) scanf("%lld", a + i);
	for(ll i = 1; i <= n; i++) scanf("%lld", b + i);
	for(ll i = n; i; i--) {
		ll sum = 0, w = a[i] ^ b[i]; c[i] = 0;
		for(ll j = 0; j < 60; j++) d[j] = pos[j] = 0;
		for(ll j = 1; j < i; j++) {
			ll tmp = b[j]; c[j] = 0, pos[j] = -1;
			for(ll k = 59; ~k; k--)
				if(tmp & (1ll << k)) {
					c[j] |= (1ll << k);
					if(!d[k]) { d[k] = tmp, pos[j] = k; break; }
					tmp ^= d[k];
				}
		} ll x = 0;
		for(ll j = 59; ~j; j--)
			if(w & (1ll << j))
				x |= (1ll << j), w ^= d[j];
		for(ll j = 1; j < i; j++) x ^= c[j];
		if(w) { puts("No"); return 0; }
		for(ll j = i - 1; j; j--)
			if(pos[j] >= 0 && (x & (1ll << pos[j]))) {
				res.pb(j + 1);
				for(ll k = 2; k <= j + 1; k++)
					x ^= c[k - 1], c[k] ^= c[k - 1],
					b[k] ^= b[k - 1];
			}
		res.pb(i);
		for(ll j = 2; j <= i; j++) b[j] ^= b[j - 1];
	}
	reverse(res.begin(), res.end());
	printf("Yes\n%lld\n", (ll) res.size());
	for(ll i: res) printf("%lld ", i);
	return 0;
}

出处:https://www.cnblogs.com/Sktn0089/p/18451825

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Lgx_Q  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2023-10-08 LGJOI - 竞赛图【题解】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示