constexprint mod = 998244353; constexprint N = 5e5 + 8;
structSMT { structinfo { int mx; int mrk; int l, r; } t[N << 6]; voidpush_up(info& p, info l, info r){ p.mx = max(l.mx, r.mx); } voidpush_down(info& p, int d, int l){ p.mx += d; p.mrk += d; }
// ... } smt;
voideachT(){ int n = read(), k = read(); vector<pair<int, int>> a(n); for (auto& [l, r] : a) { l = read(), r = read(); } sort(a.begin(), a.end()); smt.init(1, 1e9); ll res = 1; for (auto& [l, r] : a) { auto qq = smt.query(l, r); res *= k - qq.mx; res %= mod; smt.modify(l, r, 1); } printf("%lld\n", res); }
ll ans = 0; vector<int> good(m); auto check = [&](int id) { int sum = 0; for (auto& p : vec[id]) sum += t[p]; if (good[id]) ans -= (id + 1ll) * (id + 1ll); if (sum == 1) ans += (id + 1ll) * (id + 1ll), good[id] = 1; };
auto build = [&](auto&& self, int p, int cl, int cr) -> void { if (cl == cr) return t[p] = 1, void(); self(self, lson), self(self, rson); t[p] = t[ls] + t[rs]; }; build(build, 1, 0, n - 1);
for (int id = 0; id < m; ++id) { int l = read(), r = read();
auto dfs = [&](auto&& self, int l, int r, int p, int cl, int cr) -> void { if (l <= cl && cr <= r) return ids[p].push_back(id), vec[id].push_back(p); if (l <= mid) self(self, l, r, lson); if (mid < r) self(self, l, r, rson); }; dfs(dfs, l, r, 1, 0, n - 1);
check(id); }
printf("%lld ", ans); for (int i = 0; i < n; ++i) { int x = (read() + ans) % n;
auto dfs = [&](auto&& self, int p, int cl, int cr) -> void { if (cl == cr) { t[p] = 0; } else { if (x <= mid) self(self, lson); elseself(self, rson); t[p] = t[ls] + t[rs]; }
if (t[p] == 0 || t[p] == 1) { for (auto& id : ids[p]) check(id); } }; dfs(dfs, 1, 0, n - 1);
voideachT(){ unordered_map<int, vector<pair<int, int>>> X, Y; int n = read(); for (int i = 0; i < n; ++i) { int x = read(), y = read(); X[x].emplace_back(y, 1); Y[y].emplace_back(x, 1); } int m = read(); for (int i = 0; i < m; ++i) { int x = read(), y = read(); X[x].emplace_back(y, 0); Y[y].emplace_back(x, 0); }
n = boy.size(), m = girl.size(); vector<vector<int>> E(n); for (int u = 0; u < n; ++u) { auto& [x, y1, y2] = boy[u]; for (int v = 0; v < m; ++v) { auto& [y, x1, x2] = girl[v]; if (x1 < x && x < x2 && y1 < y && y < y2) { E[u].push_back(v); } } }
if (ugly) { printf("-1\n"); return; }
vector<int> npy(m, -1); for (int u = 0; u < n; ++u) { vector<int> vis(m, 0); auto dfs = [&](auto&& self, int u) -> bool { for (auto& v : E[u]) { if (vis[v]) continue; vis[v] = 1; if (npy[v] == -1 || self(self, npy[v])) { npy[v] = u; returntrue; } } returnfalse; }; dfs(dfs, u); }
vector<pair<int, int>> res; vector<int> happy(n, false); for (int v = 0; v < m; ++v) { if (npy[v] != -1) { happy[npy[v]] = true; res.emplace_back(boy[npy[v]][0], girl[v][0]); } else { auto& [y, x1, x2] = girl[v]; res.emplace_back(x1 + x2 >> 1, y); } } for (int u = 0; u < n; ++u) { if (!happy[u]) { auto& [x, y1, y2] = boy[u]; res.emplace_back(x, y1 + y2 >> 1); } }
voidpush_up(int p){ push_up(t[p], t[ls], t[rs]); } voidpush_down(int p, int l){ push_down(t[ls], t[p].mrk, l - (l >> 1)); push_down(t[rs], t[p].mrk, l >> 1); t[p].mrk = 0; }
voidbuild(auto& arr, int& p = rt, int cl = L, int cr = R){ p = ++pcnt, init(p); if (cl == cr) returnpush_down(t[p], arr[cl], 1); build(arr, lson), build(arr, rson); returnpush_up(p); }
voidmodify(int l, int r, ll d, int& p = rt, int cl = L, int cr = R){ if (l <= cl && cr <= r) returnpush_down(t[p], d, len); push_down(p, len); if (l <= mid) modify(l, r, d, lson); if (mid < r) modify(l, r, d, rson); returnpush_up(p); }
info query(int l, int r, int& p = rt, int cl = L, int cr = R){ if (l <= cl && cr <= r) return t[p]; push_down(p, len); if (r <= mid) returnquery(l, r, lson); if (mid < l) returnquery(l, r, rson); info res; push_up(res, query(l, r, lson), query(l, r, rson)); return res; } } smt;
vector<pair<int, int>> E[N]; // [v, id] int son[N]; // 边对应的另一端点 ll w[N]; // 边权 ll dep[N]; int siz[N]; int tfn[N], tfnR[N], tseq[N << 1], tunix; // 全 DFS 序 voiddfs(int u, int p){ tseq[++tunix] = u; tfn[u] = tunix; siz[u] = 1; for (auto& [v, id] : E[u]) { if (v == p) continue; son[id] = v; dep[v] = dep[u] + w[id]; dfs(v, u); siz[u] += siz[v]; tseq[++tunix] = u; } tfnR[u] = tunix; }
voidinit(){ dfs(1, 0); smt.init(1, tunix); vector<ll> arr(tunix + 1); for (int i = 1; i <= tunix; i++) { arr[i] = dep[tseq[i]]; } smt.build(arr); }
voidchange(int id, ll e){ int v = son[id]; smt.modify(tfn[v], tfnR[v], -w[id]); w[id] = e; smt.modify(tfn[v], tfnR[v], w[id]); }
ll get(){ return smt.query(1, tunix).abc; }
voideachT(){ int n = read(), q = read();
for (int id = 1; id < n; id++) { int u = read(), v = read(); w[id] = read(); E[u].emplace_back(v, id); E[v].emplace_back(u, id); }
init();
vector<vector<int>> vec(n); for (int id = 1; id < n; id++) { int v = son[id]; vec[min(siz[v], n - siz[v])].push_back(id); }
vector<vector<tuple<int, int, int>>> que(n); for (int qid = 0; qid < q; qid++) { int id = read(), e = read(), k = read(); que[k].emplace_back(id, e, qid); }
vector<ll> ans(q); for (int k = 1; k < n; k++) { for (auto& [id, e, qid] : que[k]) { int old = w[id]; if (old) change(id, e); ans[qid] = get(); change(id, old); } for (auto& id : vec[k]) { change(id, 0); } }
for (int i = 0; i < q; i++) { printf("%lld\n", ans[i]); } }
M. Palindromic Polygon (432 + 10)
先是 WA,以为我的优化在最坏情况下没有优化,所以换了一种写法,然后 TLE 了。以为复杂度没算错,所以在各种常数优化又多了很多罚时。其实第一次提交是最接近正解的……
ll Area(Point a, Point b, Point c){ returnabs((b - a) * (c - a)); }
voideachT(){ int n; cin >> n;
vector<int> a(n << 1); vector<int> alls; for (int i = 0; i < n; i++) { cin >> a[i]; alls.push_back(a[i]); }
sort(alls.begin(), alls.end()); unique(alls.begin(), alls.end()); for (int i = 0; i < n; i++) { a[i] = lower_bound(alls.begin(), alls.end(), a[i]) - alls.begin(); a[i + n] = a[i]; }
vector lst(n << 1, vector<int>(n, -1)), nxt(n << 1, vector<int>(n, n << 1)); for (int i = 0; i < n << 1; ++i) { if (i) lst[i] = lst[i - 1]; lst[i][a[i]] = i; } for (int i = (n << 1) - 1; i >= 0; --i) { if (i != (n << 1) - 1) nxt[i] = nxt[i + 1]; nxt[i][a[i]] = i; }
vector<Point> pos(n << 1); for (int i = 0; i < n; i++) { cin >> pos[i].x >> pos[i].y; pos[i + n] = pos[i]; }
vector dp(n << 1, vector<ll>(n << 1, -1)); auto dfs = [&](auto&& self, int L, int R) -> ll { if (dp[L][R] != -1) return dp[L][R]; if (a[L] != a[R]) return dp[L][R] = 0; if (L + 1 >= R) return dp[L][R] = 0;
ll res = 0; for (int l = L + 1; l < R; ++l) { int r = lst[R - 1][a[l]]; res = max(res, self(self, l, r) + Area(pos[L], pos[l], pos[R]) + Area(pos[l], pos[r], pos[R])); } for (int r = R - 1; r > L; --r) { int l = nxt[L + 1][a[r]]; res = max(res, self(self, l, r) + Area(pos[L], pos[l], pos[R]) + Area(pos[l], pos[r], pos[R])); } return dp[L][R] = res; };
ll res = 0; for (int l = 0; l < n << 1; ++l) { for (int r = l; r < min(l + n, n << 1); ++r) { if (a[l] == a[r]) res = max(res, dfs(dfs, l, r)); } } cout << res << '\n'; }