社区讨论

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 条回复,欢迎继续交流。

正在加载回复...