P9333 [JOISC 2023 Day2] Council
钦定议长后,决定副议长时每个议案的赞成票数变动幅度最大为 \(1\),所以只有赞成票数为 \(\lfloor \dfrac n 2 \rfloor\) 的议案的通过与否会发生变化。
设第 \(i\) 名议员投反对票的议案集合为 \(T_i\),钦定议长为 \(i\) 后可能发生变化的议案集合为 \(S_i\),则问题转化为求 \(\max\limits_{ j \ne i} |S_i \cap T_j|\)。
显然 \(T_j \supseteq (S_i \cap T_j), (S_i \cap T_j) \subseteq S_i\),所以由 \(T_j\) 推到 \(S_i\) 先做一遍超集和,再做一遍子集和即可(可参考 SOSDP)。
令 \(f(S)\) 表示能使 \(|S \cap T_j|\) 取得最大值的 \(j\),注意到 \(f(S_i) \ne i\),所以要维护两个(即最大值和次大值对应的) \(j\)。
时间复杂度 \(\mathcal O(nm + m2^m)\)。
代码:
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 3e5 + 10, M = 20;
int n, m, a[N][M + 1], c[M + 1], T[N], f[1 << M][2];
int S0, S1, cnt;
int main() {
ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < m; j++) cin >> a[i][j], T[i] = (T[i] << 1) ^ a[i][j] ^ 1, c[j] += a[i][j];
f[T[i]][0] ? f[T[i]][1] = i : f[T[i]][0] = i;
}
for (int i = 0; i < m; i++) {
if (c[m - i - 1] == n / 2) S0 ^= (1 << i);
else if (c[m - i - 1] == n / 2 + 1) S1 ^= (1 << i);
else cnt += (c[m - i - 1] > n / 2);
}
for (int i = 0; i < m; i++) {
for (int S = 0; S < (1 << m); S++) {
if (!(S & (1 << i))) {
int *from = f[S ^ (1 << i)], *to = f[S];
if (!to[0]) to[0] = from[0], to[1] = from[1];
else if (!to[1]) to[1] = from[0] == to[0] ? from[1] : from[0];
}
}
}
vector<int> w;
for (int i = 0; i < m; i++) {
for (int S = 0; S < (1 << m); S++) {
if (S & (1 << i)) {
w.clear();
int *from = f[S ^ (1 << i)], *to = f[S];
for (int i : {0, 1}) w.emplace_back(to[i]), w.emplace_back(from[i]);
sort(w.begin(), w.end(), [&](int a, int b) {return __builtin_popcount(S & T[a]) > __builtin_popcount(S & T[b]);});
w.erase(unique(w.begin(), w.end()), w.end());
to[0] = w[0]; if (w.size() > 1) to[1] = w[1];
}
}
}
for (int i = 1; i <= n; i++) {
int S = (S0 & T[i]) | (S1 & (~T[i]));
cout << cnt + __builtin_popcount(S1 & T[i]) + __builtin_popcount(S & T[f[S][0] == i ? f[S][1] : f[S][0]]) << '\n';
}
return 0;
}
作者:chy12321
出处:https://www.cnblogs.com/chy12321/p/17933679.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2022-12-28 洛谷P8868 [NOIP2022] 比赛