CF2170F Build XOR on a Segment 题解
可能第一个想法会是从不同的起点开始 dp,求出
那么观察一下,根据线性代数的知识,可以发现每个询问的答案不会超过
算一下更新
这场考虑到 dirty 程度 D>>>EF,不好评价。
#include <bits/stdc++.h>
typedef std::pair<int, int> pii;
int a[10005], n, q, f[4096][13], nf[4096][13], ans[1000005], val[1000005];
std::vector<pii> query[10005];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
scanf("%d", &q);
for (int i = 1; i <= q; ++i) {
int l, r;
scanf("%d%d%d", &l, &r, &val[i]);
query[r].push_back(pii(l, i));
}
memset(f, -1, sizeof(f));
for (int i = 1; i <= n; ++i) {
memcpy(nf, f, sizeof(f));
for (int o = 0; o < 4096; ++o) {
nf[a[i]][1] = i;
for (int p = 1; p <= 11; ++p) {
if (f[o][p] == -1) {
continue;
}
nf[o ^ a[i]][p + 1] = std::max(nf[o ^ a[i]][p + 1], f[o][p]);
}
}
memcpy(f, nf, sizeof(f));
for (auto [x, y]: query[i]) {
ans[y] = 0;
for (int p = 1; p <= 12; ++p) {
if (f[val[y]][p] >= x) {
ans[y] = p;
break;
}
}
}
}
for (int i = 1; i <= q; ++i) {
printf("%d ", ans[i]);
}
printf("\n");
return 0;
}