Разбор Codeforces Round 1103 (Div. 3)

Revision ru7, by dvb1r, 2026-06-13 17:48:32

2236A - Games on the Train

Идея: arsen1y

Разбор
Решение (arsen1y)

2236B - Tatar TV Show

Идея: eyfxrby

Подсказка
Разбор
Решение (eyfxrby)

2236C - Omsk Programmers

Идея: arsen1y

Подсказка
Разбор
Решение (arsen1y)

2236D - Brand New Tatar TV Show

Идея: dvb1r

Подсказка 1
Подсказка 2
Разбор
Решение (dvb1r)

2236E - Friendly Gifts

Идея: arsen1y

Подсказка
Разбор
Решение (dvb1r)

2236F1 - Elections in Saransk (easy version)

Идея: eyfxrby

Подсказка 1
Подсказка 2
Разбор
Решение (eyfrxby)

2236F2 - Elections in Saransk (hard version)

Идея: eyfxrby

Разбор
Решение 1 (eyfrxby)
Решение 2 (Treks)

2236G - Criterion in Burlandia

Идея: dvb1r

Подсказка 1
Подсказка 2
Подсказка 3
Подсказка 4
Разбор
Решение 1 (dvb1r)

<spoiler summary="Решение 2 (Treks)" ~~~~~ //#pragma GCC optimize("Ofast") //#pragma GCC optimize("O3,unroll-loops")

include <bits/stdc++.h>

include <experimental/random>

include <ext/pb_ds/assoc_container.hpp>

using namespace std; using namespace __gnu_pbds;

using ll = long long; using ld = long double; using ordered_set = tree<ll, null_type, less, rb_tree_tag, tree_order_statistics_node_update>; using str = string; const ll INF = 1e18, MOD = 1e9 + 7; template using pq_min = priority_queue<T, vector, greater>; template using pq_max = priority_queue<T, vector, less>;

define int long long

void solve();

signed main() {

ifdef LOCAL

freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);

endif

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll q = 1;
cin >> q;
while (q--) {
    solve();
    //cout << "\n";
}

}

vector<vector> g; vector a; int h; vector us; int cnt1; vector T;

void dfs1(int v, int pr) { T.push_back(v); cnt1++; for (auto to: g[v]) { if (to != pr && !us[to]) { dfs1(to, v); } } }

int dfs(int v, int pr) { bool p = true; int cnt = 1; for (auto to: g[v]) { if (to != pr && !us[to]) { auto u = dfs(to, v); if (u > cnt1 / 2) { p = false; } cnt += u; } } if (p && (cnt1 — cnt) <= cnt1 / 2) { h = v; } return cnt; }

int E = 0;

vector ans; vector<vector> mn; vector col; vector sz; vector W;

void dfs(int v, int pr, vector s, int an, int o, int mx) { sz[v] = o; col[v] = E; W[v] = W[pr]; for (int i = 0; i < 20; ++i) {
mn[v][i] = mn[pr][i]; } for (int i = 0; i < 20; ++i) { if ((a[v] >> i) & 1) { if (mn[v][i] != INF) { W[v] = min(W[v], o); } mn[v][i] = min(mn[v][i], o); mx = max(mx, s[i]); s[i] = o; } } an += o — mx; ans[v] = an; for (auto to: g[v]) { if (to != pr && !us[to]) { dfs(to, v, s, an, o + 1, mx); } } }

vector<vector<pair<int, int>>> que; vector ANS;

void rec(int v) { T.clear(); cnt1 = 0; dfs1(v, -1); dfs(v, -1); v = h; us[v] = true; mn[v] = vector(20, INF); int S = E; W[v] = INF; for (auto to: g[v]) { if (!us[to]) { E++; vector s(20, 0); dfs(to, v, s, 0, 1, 0); } } ans[v] = 0; ++E; col[v] = E; for (auto x: T) { for (auto [y, id]: que[x]) { if (col[x] != col[y] && col[x] > S && col[y] > S) { ANS[id] = ans[x] + ans[y]; if (x == v) { int MN = min(W[y], sz[y] + 1); for (int i = 0; i < 20; ++i) { if ((a[v] >> i) & 1) { MN = min(MN, mn[y][i]); } } ANS[id] += MN; } else if (y == v) { int MN = min(W[x], sz[x] + 1); for (int i = 0; i < 20; ++i) { if ((a[v] >> i) & 1) { MN = min(MN, mn[x][i]); } } ANS[id] += MN; } else { vector<pair<int, int>> upd; for (int i = 0; i < 20; ++i) { if (mn[x][i] != INF) { upd.push_back({mn[x][i], i}); } } int e = min(W[y], sz[y] + 1); for (int i = 0; i < 20; ++i) { if ((a[v] >> i) & 1) { e = min(e, mn[y][i]); } } sort(upd.begin(), upd.end()); int p = 0; bool flag = true; for (int i = 0; i < upd.size(); ++i) { if (upd[i].first >= W[x]) { ANS[id] += (W[x] — p) * e; flag = false; break; } ANS[id] += (upd[i].first — p) * e; if ((a[v] >> upd[i].second) & 1) { flag = false; break; } e = min(e, mn[y][upd[i].second]); p = upd[i].first; } if (flag) { ANS[id] += (min(W[x], sz[x] + 1) — p) * e; } } } } } for (int i = 0; i < g[v].size(); ++i) { int to = g[v][i]; if (!us[to]) { rec(to); } } }

void solve() { int n, q; cin >> n >> q; sz.clear(); W.clear(); W.resize(n); sz.resize(n); ans.clear(); ANS.clear(); ANS.resize(q, -1); mn.clear(); ans.resize(n); mn.resize(n, vector(20)); a.clear(); us.clear(); us.resize(n); a.resize(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } g.clear(); col.clear(); col.resize(n); que.clear(); que.resize(n); g.resize(n); for (int i = 0; i < n — 1; ++i) { int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); } for (int i = 0; i < q; ++i) { int x, y; cin >> x >> y; --x; --y; que[x].push_back({y, i}); } rec(0); for (int i = 0; i < q; ++i) { if (ANS[i] == -1) { exit(-1); } cout << ANS[i] << "\n"; } } ~~~~~

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en8 English dvb1r 2026-06-13 18:48:16 22
en7 English dvb1r 2026-06-13 18:45:30 6 Tiny change: '\cdot p_2 * \ldots \c' -> '\cdot p_2 \cdot \ldots \c'
en6 English dvb1r 2026-06-13 18:42:23 0 (published)
ru17 Russian dvb1r 2026-06-13 18:42:11 0 (опубликовано)
ru16 Russian dvb1r 2026-06-13 18:40:19 6 Мелкая правка: 'всегда не меньше их сум' -> 'всегда не больше их сум'
en5 English dvb1r 2026-06-13 18:38:58 31
ru15 Russian dvb1r 2026-06-13 18:37:58 39
en4 English dvb1r 2026-06-13 18:21:15 4
ru14 Russian dvb1r 2026-06-13 18:20:50 4
ru13 Russian dvb1r 2026-06-13 18:15:57 8
en3 English dvb1r 2026-06-13 18:15:35 2561
en2 English dvb1r 2026-06-13 18:10:27 12107
ru12 Russian dvb1r 2026-06-13 18:00:03 13 Мелкая правка: 'азка 1">\nОтрезки мас' -> 'азка 1">\nВырезаемые отрезки мас'
ru11 Russian dvb1r 2026-06-13 17:59:06 138
en1 English dvb1r 2026-06-13 17:55:42 18028 Initial revision for English translation (saved to drafts)
ru10 Russian dvb1r 2026-06-13 17:53:54 4
ru9 Russian dvb1r 2026-06-13 17:52:25 630
ru8 Russian dvb1r 2026-06-13 17:48:56 9 Мелкая правка: '2 (Treks)"\n~~~~~\n/' -> '2 (Treks)">\n~~~~~\n/'
ru7 Russian dvb1r 2026-06-13 17:48:32 8039
ru6 Russian dvb1r 2026-06-13 17:17:58 4 Мелкая правка: 'turn 0;\n}~~~~~\n</s' -> 'turn 0;\n}\n~~~~~\n</s'
ru5 Russian dvb1r 2026-06-13 17:16:28 84 Мелкая правка: 'Решение 2([user:Treks])">\n~~~~~' -> 'Решение 2( [user:Treks] )">\n~~~~~'
ru4 Russian dvb1r 2026-06-13 17:10:48 3211 Мелкая правка: '\n[problem:2' -> '[problem:2'
ru3 Russian dvb1r 2026-06-13 17:04:48 272
ru2 Russian dvb1r 2026-06-13 17:01:02 70
ru1 Russian dvb1r 2026-06-13 16:58:14 18065 Первая редакция (сохранено в черновиках)