UNR #7 Day1 比特迷宫 个人记录
思路
构造,且上界并不是特别严格。/bx/bx/bx
首先加法比较“混合”,考虑转成位运算,具体地,钦定操作的
考虑递归成子问题,按照 popcount 分组,有一个关键观察是:我们在操作一个
具体而言,假设我们在操作 10111,我们要使得 10110 和 10101 01翻转,那我们可以使 a|b = 10111,且 b = 00011,即我们要的
发现这个时候 < k - 1 的位上的 a 会受到一堆操作的影响,那我们直接先不管它,因为我们在操作
那么我们考虑求出
有知道的老哥能不能教教我/kel
好像没什么细节,注意一开始若
代码
const int N = 1 << 20;
const int LogN = 20;
int n, k, _, tot;
int a[N], vis[N], cnt[N], inT[N];
vector <int> pos[LogN + 1], val[LogN + 1], T[LogN + 1];
vector <pii> opt;
void answer(int a, int b) {
assert((a & b) == 0);
int s = b;
do {
Main::a[a | s] ^= 1;
} while(s && (s = (s - 1) & b, 1));
opt.eb(a, b);
}
void output() {
printf("%llu\n", opt.size());
for (pii _ : opt) {
int a = _.fi, b = _.se;
printf("%d %d\n", a, b);
}
fflush(stdout);
}
void skymaths() {
read(n, k, _);
for (int i = 0; i < n; ++i) read(a[i]);
// read(k); n = 1 << k;
for (int i = 0; i < n; ++i) {
vis[i] = 1;
pos[cnt[i] = __builtin_popcount(i)].emplace_back(i);
}
rep (c, 1, k) {
// 求 T(c),即覆盖所有 T(c - 1)
for (int i = 0; i <= k; ++i) val[i].clear();
for (int v : pos[c]) {
val[c].eb(v);
assert(cnt[v] == c);
// printf("c = %d, v = %d\n", c, v);
}
per (i, k, 1) {
for (int v : val[i]) {
if (cnt[v] != i) {
// printf(" %d cnt -> %d\n", v, cnt[v]);
// assert(cnt[v] < i);
val[cnt[v]].eb(v);
continue;
}
T[c].eb(v); ++tot;
inT[v] = 1;
rep (j, 0, k - 1) {
if ((v >> j & 1) && vis[v ^ (1 << j)]) {
int t = v ^ (1 << j);
vis[t] = 0;
rep (bit, 0, k - 1) {
if (t >> bit & 1) continue;
--cnt[t ^ (1 << bit)];
}
}
}
}
}
}
// 此时输出 tot 就是 sum |Tk|
if (!a[n - 1]) answer(n - 1, 0);
per (i, k, 1) {
for (int v : T[i]) {
int msk = 0;
rep (j, 0, k - 1) {
if (v >> j & 1) {
if (a[v ^ (1 << j)] != inT[v ^ (1 << j)]) msk |= 1 << j;
}
}
answer(v ^ msk, msk);
}
}
rep (i, 0, n - 1) {
if (a[i] != 0) {
cerr << "Wrong on i = " << i << endl;
}
}
output();
// check 正确性用的代码
// clr(vis);
// rep (c, 1, k) {
// for (int v : T[c]) {
// rep (j, 0, k - 1) {
// if (v >> j & 1) {
// vis[v ^ (1 << j)] = 1;
// }
// }
// }
// }
// rep (i, 0, n - 1) {
// if (!vis[i]) {
// printf("wrong on i = %d\n", i);
// }
// }
// printf("%d\n", tot);
// return ;
// rep (c, 1, k) {
// printf("T(%d) = \n", c);
// for (int v : T[c]) {
// printf("%d ", v);
// }
// printf("\n");
// }
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2023-11-13 ARC119F 题解