ARC145E 做题记录
超棒的题目。
考虑到差分的性质不够好,转化为将
枚举
一个高妙的处理:考虑找出
对于线性基的每一个二进制元素,设其在
- 启示:逆操作的转化;线性基,将每一位转化为每一个空间维度
点击查看代码
#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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2023-10-08 LGJOI - 竞赛图【题解】