array<int, 3> res{inf, inf, inf}; // len, L, R auto solve = [&](int l, int r) { auto check = [&](int len) { // [l, r] subset [L, R] for (int L = 0; L + len - 1 < n; L++) { int R = L + len - 1; if (L <= l && r <= R) { bool ok = true; array<int, 3> cnt{}; for (int o = 0; o < 3; o++) { cnt[o] = pre[R + 1][o] - pre[L][o]; } for (int o = 0; o < 3; o++) { int x = 0; x += L > 0 && o == s[L - 1]; x += R < n - 1 && o == s[R + 1]; if (cnt[o] > (len + 1 - x) / 2) { ok = false; } } if (ok) { return array{len, L, R}; } } } return array{inf, inf, inf}; }; int lo = r - l + 1; int hi = n + 1; while (lo < hi) { int mid = lo + hi >> 1; if (check(mid) != array{inf, inf, inf}) { hi = mid; } else { lo = mid + 1; } } res = min(res, check(lo)); }; if (l != r + 1) { solve(l, r); } else { solve(l, l); solve(r, r); }
int L = res[1]; int R = res[2];
assert(L < n && R < n); cout << L + 1 << " " << R + 1 << endl;
array<int, 3> cnt{}; for (int o = 0; o < 3; o++) { cnt[o] = pre[R + 1][o] - pre[L][o]; }
for (auto seq : {array{0, 1, 2}, {0, 2, 1}, {1, 0, 2}, {1, 2, 0}, {2, 1, 0}, {2, 0, 1}}) { for (int op = 0; op < 2; op++) { vector<int> vis(n); bool ok = true; for (int j = 0; j < 3; j++) { int o = seq[j]; if (!ok) { break; } if (op ? j == 0 : j) { int i = L; for (int _ = 0; _ < cnt[o]; _++) { while (i <= R && vis[i]) { i++; } if (i == R + 1) { ok = false; break; } vis[i] = true; s[i] = o; i += 2; } } else { int i = R; for (int _ = 0; _ < cnt[o]; _++) { while (i >= L && vis[i]) { i--; } if (i == L - 1) { ok = false; break; } vis[i] = true; s[i] = o; i -= 2; } } } if (!ok) { continue; }
int l = n, r = -1; for (int i = 1; i < n; i++) { if (s[i] == s[i - 1]) { l = min(l, i); r = max(r, i - 1); } } if (l == n && r == -1) { for (auto& c : s) { c = CWP[c]; } cout << s << endl; return; } } } assert(false); return; }
int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a.begin(), a.end()); int s = 0; for (int i = 0; i < n; i++) { if (s >= a[i]) { s++; } else { s--; } } int maxx = s; s = 0; for (int i = n - 1; i >= 0; i--) { if (s >= a[i]) { s++; } else { s--; } } int minn = s;
vector a(n, vector<int>(n)); for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { cin >> a[i][j]; a[j][i] = a[i][j]; } }
vector<vector<int>> adj(n); for (int u = 0; u < n; u++) { for (int v = u; v < n; v++) { int lca = a[u][v] ^ a[0][u] ^ a[0][v]; lca--; if (lca != u) { adj[lca].push_back(u); } if (lca != v) { adj[lca].push_back(v); } } }
vector<int> deg(n); for (int x = 0; x < n; x++) { for (auto y : adj[x]) { deg[y]++; } } queue<int> Q; for (int x = 0; x < n; x++) { if (deg[x] == 0) { Q.push(x); } }
vector<pair<int, int>> res; while (!Q.empty()) { auto x = Q.front(); Q.pop(); for (auto y : adj[x]) { if (--deg[y] == 0) { res.push_back({x, y}); Q.push(y); } } }
for (auto [x, y] : res) { cout << x + 1 << " " << y + 1 << endl; }
vector<ll> c(n); for (int i = 0; i < n; i++) { cin >> c[i]; }
vector<vector<int>> adj(n); for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; x--; y--; adj[x].push_back(y); adj[y].push_back(x); }
vector<int> parent(n, -1); vector<int> dfn(n), dfm(n), ord; auto dfs0 = [&](thisauto self, int x) -> void { if (parent[x] != -1) { adj[x].erase(find(adj[x].begin(), adj[x].end(), parent[x])); } dfn[x] = ord.size(); ord.push_back(x); for (auto y : adj[x]) { parent[y] = x; self(y); } dfm[x] = ord.size(); }; dfs0(0);
vector<ll> f(n); // get himself vector<ll> g(n); // get his parent auto dfs1 = [&](thisauto self, int x) -> void { f[x] = c[x]; if (adj[x].empty()) { return; } int m = adj[x].size(); vector<ll> v; for (auto y : adj[x]) { self(y); v.push_back(f[y]); } auto pre = v, suf = v; for (int i = 1; i < m; i++) { pre[i] = min(pre[i], pre[i - 1]); } for (int i = m - 2; i >= 0; i--) { suf[i] = min(suf[i], suf[i + 1]); } for (int i = 0; i < m; i++) { int y = adj[x][i]; g[y] = inf; if (i > 0) { g[y] = min(g[y], pre[i - 1]); } if (i < m - 1) { g[y] = min(g[y], suf[i + 1]); } } sort(v.begin(), v.end()); f[x] = min(f[x], v[0] + v[1]); }; dfs1(0);
vector<ll> sumg(n); auto dfs2 = [&](thisauto self, int x) -> void { for (auto y : adj[x]) { sumg[y] = g[y] + sumg[x]; self(y); } }; dfs2(0);
auto is_ancester = [&](int x, int y) { return dfn[x] <= dfn[y] && dfn[y] < dfm[x]; };
while (q--) { int x, y; cin >> x >> y; x--; y--; if (!is_ancester(y, x)) { cout << -1 << endl; } else { cout << sumg[x] - sumg[y] << endl; } } }
vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; }
vector<int> b(n); for (int i = 0; i < n; i++) { cin >> b[i]; }
for (int i = 0; i < n; i++) { if ((a[i] & b[i]) != b[i]) { cout << "No\n"; return; } }
if (a == b) { cout << "Yes\n"; return; }
int s = n; int t = s + 1; MaxFlow maxflow(t + 1); for (int i = 0; i < n; i++) { maxflow.add(s, b[i], 1); maxflow.add(i, t, 1); for (int bit = 0; bit < 20; bit++) { if (i >> bit & 1) { maxflow.add(i ^ (1 << bit), i, inf); } } }