社区讨论
WA on #26 MnZn 求助
CF1242C Sum Balance参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m3mmaoug
- 此快照首次捕获于
- 2024/11/18 14:01 去年
- 此快照最后确认于
- 2025/11/04 14:29 4 个月前
有解判成无解了。实在调不出来了 TAT
CPP#include <bits/stdc++.h>
using namespace std;
namespace liuzimingc {
#define pii pair<int, int>
#define endl '\n'
#define int long long
const int maxn = 20, maxm = 5e3 + 5, maxk = 7.5e4 + 5;
int n, m[maxn], a[maxn][maxm], sum[maxn], id[maxn][maxm], tot, total_sum, d, to[maxk], row[maxk], total_cnt, pre[maxk], num[maxk];
bool in_cir[maxk];
vector<int> b[maxk];
vector<tuple<int, int, int>> ans;
int vis[maxk], l[maxk], r[maxk], state[maxk], state_to[1 << 15], dent[maxk];
bool f[maxk];
map<int, int> vis_;
vector<int> e[maxk];
stack<int> s;
void print(int i) {
if (!pre[i]) {
int id = state_to[i];
for (int j = l[id] - 1; j <= r[id] - 1; j++)
ans.push_back(make_tuple(row[b[id][j]], num[b[id][j]], row[to[b[id][j]]]));
return;
}
else print(pre[i]), print(i ^ pre[i]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> m[i];
for (int j = 1; j <= m[i]; j++) {
cin >> a[i][j];
sum[i] += a[i][j];
id[i][j] = ++tot;
num[tot] = a[i][j];
vis_[a[i][j]] = tot;
row[tot] = i;
}
total_sum += sum[i];
}
if (total_sum % n) return cout << "No" << endl, 0;
d = total_sum / n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m[i]; j++)
if (vis_.count(d - sum[i] + a[i][j]) && row[vis_[d - sum[i] + a[i][j]]] != i)
to[vis_[d - sum[i] + a[i][j]]] = id[i][j];
for (int i = 1; i <= n; i++)
if (sum[i] == d)
for (int j = 1; j <= m[i]; j++)
to[id[i][j]] = id[i][j];
for (int i = 1; i <= tot; i++)
if (!in_cir[i]) {
int x = i;
total_cnt++;
while (to[x]) {
b[total_cnt].push_back(x);
if (vis[x]) {
l[total_cnt] = vis[x], r[total_cnt] = b[total_cnt].size() - 1;
break;
}
if (dent[row[x]] == total_cnt) break;
dent[row[x]] = total_cnt;
vis[x] = b[total_cnt].size();
x = to[x];
}
for (int j : b[total_cnt]) vis[j] = 0;
if (r[total_cnt]) {
for (int j = l[total_cnt] - 1; j <= r[total_cnt] - 1; j++) {
in_cir[b[total_cnt][j]] = true;
state[total_cnt] |= 1 << row[b[total_cnt][j]] - 1;
}
if (!state_to[state[total_cnt]]) state_to[state[total_cnt]] = total_cnt, f[state[total_cnt]] = true;
}
}
for (int i = 1; i < 1 << n; i++) {
if (f[i]) continue;
for (int j = i; j; j = (j - 1) & i)
if (f[i ^ j] && f[j]) {
f[i] = true;
pre[i] = j;
break;
}
}
if (!f[(1 << n) - 1]) return cout << "No" << endl, 0;
cout << "Yes" << endl;
print((1 << n) - 1);
sort(ans.begin(), ans.end());
for (auto i : ans) cout << get<1>(i) << " " << get<2>(i) << endl;
return 0;
}
#undef int
}
int main() {
liuzimingc::main();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...