#include<algorithm> #include<cstdio> #include<iostream> constexprint N = 2e5 + 5;
structNode { // for queries int prefix0; int suffix0; int segment0; // for filling int length; int count1; // label; int reset; Node() : prefix0(0), suffix0(0), segment0(0), length(0), count1(0), reset(-1) {} } T[N << 2];
// make [L, R] all 0s voidremove(int L, int R, int rt = 1, int l = 1, int r = n){ if (L > r or R < l) return; // no overlap if (L <= l and r <= R) { mark_zero(rt); return; } int mid = l + ((r - l) >> 1); push_down(rt); remove(L, R, rt << 1, l, mid); remove(L, R, rt << 1 | 1, mid + 1, r); pull_up(rt); } voidset_one(int L, int R, int rt = 1, int l = 1, int r = n){ if (L > r or R < l) return; // no overlap if (L <= l and r <= R) { mark_one(rt); return; } int mid = l + ((r - l) >> 1); push_down(rt); set_one(L, R, rt << 1, l, mid); set_one(L, R, rt << 1 | 1, mid + 1, r); pull_up(rt); }
intquery_sum(int L, int R, int rt = 1, int l = 1, int r = n){ if (L > r or R < l) return0; if (L <= l and r <= R) return T[rt].count1; int mid = l + ((r - l) >> 1); push_down(rt); returnquery_sum(L, R, rt << 1, l, mid) + query_sum(L, R, rt << 1 | 1, mid + 1, r); } intquery_empty(int L, int R, int rt = 1, int l = 1, int r = n){ if (L > r or R < l) return0; if (L <= l and r <= R) return T[rt].length - T[rt].count1; int mid = l + ((r - l) >> 1); push_down(rt); returnquery_empty(L, R, rt << 1, l, mid) + query_empty(L, R, rt << 1 | 1, mid + 1, r); } Node query_segment(int L, int R, int rt = 1, int l = 1, int r = n){ if (L > r or R < l) returnNode(); if (L <= l and r <= R) return T[rt]; int mid = l + ((r - l) >> 1); push_down(rt); auto left = query_segment(L, R, rt << 1, l, mid); auto right = query_segment(L, R, rt << 1 | 1, mid + 1, r); Node res; res.length = left.length + right.length; res.count1 = left.count1 + right.count1; res.prefix0 = left.prefix0; if (left.prefix0 == left.length) res.prefix0 += right.prefix0; res.suffix0 = right.suffix0; if (right.suffix0 == right.length) res.suffix0 += left.suffix0; res.segment0 = std::max({left.segment0, right.segment0, left.suffix0 + right.prefix0}); return res; }
intmain(){ std::cin >> n >> m; build();
int op, l0, r0, l1, r1; while (m--) { std::cin >> op; if (op == 0) { std::cin >> l0 >> r0; remove(l0, r0); } elseif (op == 1) { std::cin >> l0 >> r0 >> l1 >> r1; int sum = query_sum(l0, r0); remove(l0, r0); int empty = query_empty(l1, r1); int target = std::min(empty, sum); // if (target <= 0) continue;
int l = l1 - 1, r = r1 + 1; while (l + 1 < r) { int mid = l + ((r - l) >> 1); if (query_empty(l1, mid) <= target) l = mid; else r = mid; } if (l >= l1) set_one(l1, l);
#include<iostream> using i64 = longlong; constexprint P = 2333;
// f(n, m) = sum_{i=0}^m C(n, i) (mod p) intfpow(i64 b, i64 p){ int res = 1; while (p) { if (p & 1) res = res * b % P; b = b * b % P; p >>= 1; } return res; }
int C[P + 2][P + 2]; int F[P + 2][P + 2]; voidinit(){ for (int i = 1; i <= P; ++i) C[0][i] = 0; C[0][0] = 1;
for (int i = 1; i <= P; ++i) { for (int j = 0; j <= P; ++j) C[i][j] = 0; C[i][0] = C[i][i] = 1; for (int j = 1; j < i; ++j) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % P; }
// init F[][] for (int i = 0; i <= P; i++) F[i][0] = 1; for (int row = 0; row <= P; row++) { for (int col = 1; col <= P; col++) F[row][col] = (F[row][col - 1] + C[row][col]) % P; } } intlucas(i64 n, i64 k){ if (k == 0 || n == k) return1; if (n < k) return0; return C[n % P][k % P] * lucas(n / P, k / P) % P; }
intf(i64 n, i64 k){ if (n <= P and k <= P) return F[n][k]; return (F[n % P][P - 1] * f(n / P, k / P - 1) % P + lucas(n / P, k / P) * F[n % P][k % P] % P) % P; }
voidrun(){ i64 n, k; std::cin >> n >> k;
std::cout << f(n, k) << '\n'; }
intmain(){ init(); int T; std::cin >> T; while (T--) run(); }
voidcase2(vi &d, vi &c, vvi &G){ vvi f(n + 1, vi(maxc, inf)); vi cap(n + 1, 0);
auto dfs = [&](auto &&F, int u, int fa) -> void { f[u][0] = d[u]; int totcap = 0;
for (int v : G[u]) { if (v == fa) continue; totcap += c[v]; F(F, v, u); }
cap[u] = std::min(d[u], totcap);
for (int v : G[u]) { if (v == fa) continue;
int up = inf, down = inf; // up: u -> fa, down: fa -> u for (int i = 0; i <= cap[v]; i++) { up = std::min(up, f[v][i]); down = std::min(down, f[v][i] - std::min(c[u], d[v] - i)); }
vi tmp(maxc, inf); for (int i = 0; i <= cap[u]; i++) { if (f[u][i] == inf) continue; tmp[i] = std::min(tmp[i], f[u][i] + down);
int next_cap = std::min(cap[u], i + c[v]); tmp[next_cap] = std::min(tmp[next_cap], f[u][i] + up - std::min(c[v], d[u] - i)); }
for (int i = 0; i <= cap[u]; i++) f[u][i] = tmp[i]; } }; dfs(dfs, 1, 0); auto ans = *std::ranges::min_element(f[1]); std::cout << ans << '\n'; }
intmain(){ std::cin >> n;
vi d(n + 1, 0), c(n + 1, 0); vvi G(n + 1); for (int i = 1; i <= n; i++) std::cin >> d[i]; for (int i = 1; i <= n; i++) std::cin >> c[i]; for (int i = 1; i < n; i++) { int u, v; std::cin >> u >> v; G[u].push_back(v); G[v].push_back(u); }
#include<iostream> #include<numeric> #include<set> #include<vector> constexprint MAXN = 100005; using vi = std::vector<int>; using si = std::set<int>;
structUnionFind { vi fa, size; UnionFind(int n) : fa(n), size(n, 1) { for (int i = 0; i < n; ++i) fa[i] = i; } introot(int u){ return u == fa[u] ? u : fa[u] = root(fa[u]); } boolsame(int u, int v){ returnroot(u) == root(v); } voidmerge(int u, int v){ int fu = root(u), fv = root(v); if (fu == fv) return; if (size[fu] < size[fv]) std::swap(fu, fv); fa[fv] = fu; size[fu] += size[fv]; } boolcheck_connected(){ bool ok = true; for (int i = 1; i < fa.size(); ++i) { if (!same(i, 0)) { ok = false; break; } } return ok; } };
booldfs(std::vector<si> &G, int L, int R){ if (L == R) returntrue;
int length = R - L + 1; int max_size = length / 2;
int begin = L; vi nodes; for (auto v : G[begin]) if (v >= L && v <= R) nodes.push_back(v - L); if (nodes.empty()) returnfalse;
int size = nodes.size(); vi suffixgcd(size); suffixgcd[size - 1] = nodes[size - 1]; for (int i = size - 2; i >= 0; i--) suffixgcd[i] = std::gcd(suffixgcd[i + 1], nodes[i]);
int c_size = -1; for (int i = size - 1; i >= 0; i--) { if (suffixgcd[i] == nodes[i] && nodes[i] <= max_size) { c_size = nodes[i]; break; } }
if (c_size < 1) returnfalse;
// remove edges for (int u = L + c_size; u <= R; u++) { if (!G[u].contains(L + (u - L) % c_size)) returnfalse; // no such edge G[u].erase(L + (u - L) % c_size); G[L + (u - L) % c_size].erase(u); }
for (int u = L; u < L + c_size; u++) { if (G[u].empty()) continue; if (*G[u].rbegin() >= L + c_size) returnfalse; } for (int u = L + c_size; u <= R; u++) { if (G[u].empty()) continue; if (*G[u].begin() < L + c_size) returnfalse; }
returndfs(G, L, L + c_size - 1) && dfs(G, L + c_size, R); }
voidrun(){ int n, m; std::cin >> n >> m;
UnionFind uf(n); std::vector<si> G(n); bool is_valid = true; for (int i = 0, u, v; i < m; i++) { std::cin >> u >> v; if (u == v || G[u].contains(v)) is_valid = false; G[u].insert(v); G[v].insert(u); uf.merge(u, v); }