voidsolve() { int n, a, b; cin >> n >> a >> b; int x = min(a, b); if (abs(a - b) > 1) { cout << "-1\n"; return; } if ((n & 1) && ((a == b && min(a, b) > n / 2 - 1) || (a != b && max(a, b) > n / 2))) { cout << "-1\n"; return; } if ((!(n & 1) && max(a, b) > n / 2 - 1)) { cout << "-1\n"; return; } if (!a && !b) // 无极值 for (int i = 1; i <= n; i++) cout << i << ' '; elseif (a == b) // 同等个数 { for (int i = 1; i <= a; i++) cout << i << ' ' << n - i + 1 << ' '; // 构造a个极大极小值组 for (int i = a + 1; i < (n - a + 1); i++) cout << i << ' '; // 剩下的升序输出 } elseif (a > b) // 需要的极大值更多 { for (int i = 1; i <= b + 1; i++) cout << i << ' ' << n - i + 1 << ' '; // 多输出一个极大值 for (int i = n - (b + 1); i > b + 1; i--) cout << i << ' '; } else { for (int i = 1; i <= a + 1; i++) // 多输出一个极小值 cout << n - i + 1 << ' ' << i << ' '; for (int i = a + 2; i < (n - (a + 1) + 1); i++) cout << i << ' '; } cout << '\n'; } intmain() { int t; cin >> t; while (t--) solve(); return0; }
CF1608C
题意
t 组数据。有地图 1 和地图 2 ,共 n 个人,在两张地图上的战斗力分别为 ai,bi ,每一张图上各人的战斗力没有重复的值,战斗力高的一定能战胜战斗力低的。每比赛一场,淘汰输的一方,主办方可以随意搭配每一场的对战人员和地图。问每个人是否都能赢得最后的胜利(利用不同的对战顺序)
voidrebuild() { for (int i = 1; i <= sc; i++) { G2[i].clear(); G2check[i].clear(); vst[i] = false; } for (int i = 1; i <= n; i++) for (auto v : G[i]) if (scc[v] != scc[i] && !G2check[scc[i]].count(scc[v])) { G2[scc[i]].push_back(scc[v]); G2check[scc[i]].insert(scc[v]); vst[scc[v]] = true; } }
voidsolve() { cin >> n; init(); for (int i = 1; i <= n; i++) cin >> a[i].first; for (int i = 1; i <= n; i++) cin >> b[i].first; sort(a + 1, a + n + 1); sort(b + 1, b + n + 1); for (int i = 1; i < n; i++) { G[a[i + 1].second].push_back(a[i].second); G[b[i + 1].second].push_back(b[i].second); } for (int i = 1; i <= n; i++) if (!dfn[i]) dfs(i); rebuild(); for (int i = 1; i <= sc; i++) if (!vst[i]) { for (int j = 1; j <= n; j++) cout << (scc[j] == i ? '1' : '0'); break; } cout << '\n'; }
intmain() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) solve(); return0; }