CF79D Password
区间异或,套路式地差分。一次操作会使得 $i$ 与 $i+a_j$ 取反,所以将 $i$ 与 $i+a_j$ 连边。
对于两个位置,要使两者都点亮,并且不影响其他位置,其操作次数为两点的最短路。
边权都为 $1$ 的图可以 bfs $\Theta(n)$ 求出单源最短路。
对每个要点亮的点跑两两的最短路。$\Theta(kn)$。
然后转换为了完全图上最小权完美匹配问题。
枚举两个点,状压即可。
复杂度 $\Theta(k^24^k+kn+nm)$。
底数是 $4$ 是因为异或差分后 $1$ 的个数最多是 $2k$ 个的。
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> pii;
const int maxn = 1e4 + 10;
const int maxk = 22;
const int maxm = 1e2 + 10;
struct edge { int to, next; };
int n, k, m;
int a[maxn];
int b[maxn];
int d[maxn];
int head[maxn];
edge e[maxn * maxm * 2];
int cnt;
void add_edge(int u, int v) {
e[++cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
int p[maxk], c;
int dis[maxk][maxk];
int vis[maxn];
int f[1 << maxk];
void bfs(int s) {
for (int i = 1; i <= n; i++) vis[i] = 0;
for (int i = 1; i <= c; i++) dis[s][i] = 1e18;
queue<pii> q;
q.push({p[s], 0});
dis[s][s] = 0;
vis[p[s]] = 1;
while (!q.empty()) {
pii u = q.front();
q.pop();
for (int i = head[u.first]; i; i = e[i].next) {
int v = e[i].to;
if (!vis[v]) {
if (a[v]) dis[s][a[v]] = u.second + 1;
vis[v] = true;
q.push({v, u.second + 1});
}
}
}
}
inline int popcount(int x) {
int z = 0;
while (x) ++z, x &= x - 1;
return z;
}
signed main() {
cin >> n >> k >> m, ++n;
for (int i = 1; i <= k; i++) cin >> b[i], a[b[i]] = 1;
for (int i = 1; i <= m; i++) cin >> d[i];
for (int i = n; i >= 1; i--) a[i] = a[i] ^ a[i - 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (i + d[j] <= n) add_edge(i, i + d[j]);
if (i - d[j] >= 1) add_edge(i, i - d[j]);
}
}
for (int i = 1; i <= n; i++) if (a[i]) p[++c] = i, a[i] = c;
for (int i = 1; i <= c; i++) bfs(i);
f[0] = 0;
for (int i = 3; i < (1 << c); i++) {
if (popcount(i) & 1) continue;
f[i] = 1e18;
for (int j = 0; j < c; j++) {
if (!(i >> j & 1)) continue;
for (int k = j + 1; k < c; k++) {
if (!(i >> k & 1)) continue;
f[i] = min(f[i], f[(i ^ (1 << j)) ^ (1 << k)] + dis[j + 1][k + 1]);
}
}
}
if (f[(1 << c) - 1] >= 1e18) puts("-1");
else cout << f[(1 << c) - 1];
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通