From 61b9e71152dd105df0b96cde7c75d8e457990127 Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Fri, 29 Jul 2022 13:58:10 +0800 Subject: [PATCH] 4127. Abs https://hydro.ac/d/bzoj/record/62e375b3a0c462a1ac98fdfa --- BZOJ/4127/4127.cpp | 260 ++++++++++++++++++++++++++++++++++++++++++ BZOJ/4127/data/1.in | 3 + BZOJ/4127/data/1.out | 3 + BZOJ/4127/data/10.in | 3 + BZOJ/4127/data/10.out | 3 + BZOJ/4127/data/2.in | 3 + BZOJ/4127/data/2.out | 3 + BZOJ/4127/data/3.in | 3 + BZOJ/4127/data/3.out | 3 + BZOJ/4127/data/4.in | 3 + BZOJ/4127/data/4.out | 3 + BZOJ/4127/data/5.in | 3 + BZOJ/4127/data/5.out | 3 + BZOJ/4127/data/6.in | 3 + BZOJ/4127/data/6.out | 3 + BZOJ/4127/data/7.in | 3 + BZOJ/4127/data/7.out | 3 + BZOJ/4127/data/8.in | 3 + BZOJ/4127/data/8.out | 3 + BZOJ/4127/data/9.in | 3 + BZOJ/4127/data/9.out | 3 + 21 files changed, 320 insertions(+) create mode 100644 BZOJ/4127/4127.cpp create mode 100644 BZOJ/4127/data/1.in create mode 100644 BZOJ/4127/data/1.out create mode 100644 BZOJ/4127/data/10.in create mode 100644 BZOJ/4127/data/10.out create mode 100644 BZOJ/4127/data/2.in create mode 100644 BZOJ/4127/data/2.out create mode 100644 BZOJ/4127/data/3.in create mode 100644 BZOJ/4127/data/3.out create mode 100644 BZOJ/4127/data/4.in create mode 100644 BZOJ/4127/data/4.out create mode 100644 BZOJ/4127/data/5.in create mode 100644 BZOJ/4127/data/5.out create mode 100644 BZOJ/4127/data/6.in create mode 100644 BZOJ/4127/data/6.out create mode 100644 BZOJ/4127/data/7.in create mode 100644 BZOJ/4127/data/7.out create mode 100644 BZOJ/4127/data/8.in create mode 100644 BZOJ/4127/data/8.out create mode 100644 BZOJ/4127/data/9.in create mode 100644 BZOJ/4127/data/9.out diff --git a/BZOJ/4127/4127.cpp b/BZOJ/4127/4127.cpp new file mode 100644 index 00000000..d56d0501 --- /dev/null +++ b/BZOJ/4127/4127.cpp @@ -0,0 +1,260 @@ +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 1e5 + 5; + +int n, m, a[N]; +std::vector g[N]; +int cnt, id[N], rid[N], fa[N], dep[N], top[N], son[N], siz[N]; + +struct node { + int l, r; + long long sum, max, d; + size_t size; + + node() + : l(0), + r(0), + sum(0), + max(std::numeric_limits::min()), + d(0), + size(0) {} + + node(int _l, int _r) + : l(_l), + r(_r), + sum(0), + max(std::numeric_limits::min()), + d(0), + size(0) {} +} tr1[N << 2], tr2[N << 2]; // tr1: 正数 tr2: 负数 + +void dfs1(int u, int f) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + + for (int v : g[u]) { + if (v == f) continue; + dfs1(v, u); + siz[u] += siz[v]; + if (siz[son[u]] < siz[v]) son[u] = v; + } +} + +void dfs2(int u, int t) { + id[u] = ++cnt; + rid[id[u]] = u; + top[u] = t; + + if (!son[u]) return; + dfs2(son[u], t); + + for (int v : g[u]) { + if (v == fa[u] || v == son[u]) continue; + dfs2(v, v); + } +} + +inline void pushup(node* tr, int u) { + tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum; + tr[u].max = std::max(tr[u << 1].max, tr[u << 1 | 1].max); + tr[u].size = tr[u << 1].size + tr[u << 1 | 1].size; +} + +inline void pushdown(node* tr, int u) { + if (tr[u].d) { + tr[u << 1].sum += tr[u].d * tr[u << 1].size; + if (tr[u << 1].size) tr[u << 1].max += tr[u].d; + tr[u << 1].d += tr[u].d; + + tr[u << 1 | 1].sum += tr[u].d * tr[u << 1 | 1].size; + if (tr[u << 1 | 1].size) tr[u << 1 | 1].max += tr[u].d; + tr[u << 1 | 1].d += tr[u].d; + + tr[u].d = 0; + } +} + +void build(int u, int l, int r) { + tr1[u] = node(l, r); + tr2[u] = node(l, r); + + if (l == r) { + if (a[rid[l]] >= 0) { + tr1[u].sum = a[rid[l]]; + tr1[u].max = a[rid[l]]; + tr1[u].size = 1; + + } else { + tr2[u].sum = a[rid[l]]; + tr2[u].max = a[rid[l]]; + tr2[u].size = 1; + } + + return; + } + + int mid = l + r >> 1; + + build(u << 1, l, mid); + build(u << 1 | 1, mid + 1, r); + + pushup(tr1, u); + pushup(tr2, u); +} + +long long query_sum(int u, int l, int r) { + if (l <= tr1[u].l && tr1[u].r <= r) { + return tr1[u].sum - tr2[u].sum; + } + + int mid = tr1[u].l + tr1[u].r >> 1; + long long res = 0; + + pushdown(tr1, u); + pushdown(tr2, u); + + if (l <= mid) res += query_sum(u << 1, l, r); + if (r > mid) res += query_sum(u << 1 | 1, l, r); + + return res; +} + +long long query_max(node* tr, int u, int l, int r) { + if (l <= tr[u].l && tr[u].r <= r) { + return tr[u].max; + } + + int mid = tr[u].l + tr[u].r >> 1; + long long res = std::numeric_limits::min(); + + pushdown(tr1, u); + pushdown(tr2, u); + + if (l <= mid) res = std::max(res, query_max(tr, u << 1, l, r)); + if (r > mid) res = std::max(res, query_max(tr, u << 1 | 1, l, r)); + + return res; +} + +void swap_max(int u, int l, int r) { + if (tr2[u].max <= 0) return; + + if (tr2[u].l == tr2[u].r) { + tr1[u] = tr2[u]; + tr2[u] = node(l, r); + + return; + } + + int mid = tr1[u].l + tr1[u].r >> 1; + + pushdown(tr1, u); + pushdown(tr2, u); + + if (l <= mid) swap_max(u << 1, l, r); + if (r > mid) swap_max(u << 1 | 1, l, r); + + pushup(tr1, u); + pushup(tr2, u); +} + +void modify(int u, int l, int r, int d) { + if (l <= tr1[u].l && tr1[u].r <= r) { + tr1[u].sum += d * tr1[u].size; + tr1[u].d += d; + if (tr1[u].size) tr1[u].max += d; + + tr2[u].sum += d * tr2[u].size; + tr2[u].d += d; + if (tr2[u].size) tr2[u].max += d; + + return; + } + + int mid = tr1[u].l + tr1[u].r >> 1; + + pushdown(tr1, u); + pushdown(tr2, u); + + if (l <= mid) modify(u << 1, l, r, d); + if (r > mid) modify(u << 1 | 1, l, r, d); + + pushup(tr1, u); + pushup(tr2, u); +} + +void modify_path(int u, int v, int d) { + while (top[u] != top[v]) { + if (dep[top[u]] < dep[top[v]]) std::swap(u, v); + modify(1, id[top[u]], id[u], d); + swap_max(1, id[top[u]], id[u]); + u = fa[top[u]]; + } + + if (dep[u] < dep[v]) std::swap(u, v); + modify(1, id[v], id[u], d); + swap_max(1, id[v], id[u]); +} + +long long query_path(int u, int v) { + long long res = 0; + + while (top[u] != top[v]) { + if (dep[top[u]] < dep[top[v]]) std::swap(u, v); + res += query_sum(1, id[top[u]], id[u]); + u = fa[top[u]]; + } + + if (dep[u] < dep[v]) std::swap(u, v); + res += query_sum(1, id[v], id[u]); + + return res; +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n >> m; + + for (int i = 1; i <= n; i++) { + cin >> a[i]; + } + + for (int i = 1, u, v; i < n; i++) { + cin >> u >> v; + + g[u].emplace_back(v); + g[v].emplace_back(u); + } + + dfs1(1, 0); + dfs2(1, 1); + + build(1, 1, n); + + while (m--) { + int op, u, v; + + cin >> op >> u >> v; + + if (op == 1) { + int d; + + cin >> d; + + modify_path(u, v, d); + } else { // op == 2 + cout << query_path(u, v) << endl; + } + } + + return 0; +} diff --git a/BZOJ/4127/data/1.in b/BZOJ/4127/data/1.in new file mode 100644 index 00000000..8929f370 --- /dev/null +++ b/BZOJ/4127/data/1.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4ecbfed7b8f069af03c5268eb344a221b862f9ec054aaf7ae0ef02c5ea0cd6e +size 3735461 diff --git a/BZOJ/4127/data/1.out b/BZOJ/4127/data/1.out new file mode 100644 index 00000000..f6b8a0bb --- /dev/null +++ b/BZOJ/4127/data/1.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca46e511ca3d3cfade53fb96bed5cc2a085bab6d9954e9be3a72f4ac214f8d8c +size 719478 diff --git a/BZOJ/4127/data/10.in b/BZOJ/4127/data/10.in new file mode 100644 index 00000000..eb8e9c0a --- /dev/null +++ b/BZOJ/4127/data/10.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4483d76f31e7d2140cf5a0503f9ea92fb650d686d339842ee15c8ac939ee0d34 +size 3735386 diff --git a/BZOJ/4127/data/10.out b/BZOJ/4127/data/10.out new file mode 100644 index 00000000..805884e3 --- /dev/null +++ b/BZOJ/4127/data/10.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03d2f711ef5c78e14d49b3cdc46e86e86ef422ba6f865d7cdc016b7c99840ec7 +size 720656 diff --git a/BZOJ/4127/data/2.in b/BZOJ/4127/data/2.in new file mode 100644 index 00000000..f720c7cb --- /dev/null +++ b/BZOJ/4127/data/2.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7221991908c4d9194286e8025465e4c3a5cbfb9a0ec92084e5c11daf430bdcd6 +size 3784323 diff --git a/BZOJ/4127/data/2.out b/BZOJ/4127/data/2.out new file mode 100644 index 00000000..eb7e253c --- /dev/null +++ b/BZOJ/4127/data/2.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df2e86ff1218c7cb15993c3f84a7b5d7c5cb557414176dbf5ec09a0ad41ec7f9 +size 647715 diff --git a/BZOJ/4127/data/3.in b/BZOJ/4127/data/3.in new file mode 100644 index 00000000..344c0e4b --- /dev/null +++ b/BZOJ/4127/data/3.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b2ab233cc68ae9268982ab522a49bbf1c1bab974f3efcf49af1b523f0f5e2ee +size 276293 diff --git a/BZOJ/4127/data/3.out b/BZOJ/4127/data/3.out new file mode 100644 index 00000000..b718ff91 --- /dev/null +++ b/BZOJ/4127/data/3.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9361e6025ba1b3d252fb5ecf20439e81aa9b2c89b1c12a1ca4c70f725207530 +size 38147 diff --git a/BZOJ/4127/data/4.in b/BZOJ/4127/data/4.in new file mode 100644 index 00000000..73d387ff --- /dev/null +++ b/BZOJ/4127/data/4.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b280304aa2a500aaefa5642ccd064062276b2b63914c31646fd4e671f25d3d0a +size 3459877 diff --git a/BZOJ/4127/data/4.out b/BZOJ/4127/data/4.out new file mode 100644 index 00000000..75214d2c --- /dev/null +++ b/BZOJ/4127/data/4.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd2c7957cf542193b47781b88dcbd425fc91bbb8ef5db44751f863efde024877 +size 535578 diff --git a/BZOJ/4127/data/5.in b/BZOJ/4127/data/5.in new file mode 100644 index 00000000..554a6009 --- /dev/null +++ b/BZOJ/4127/data/5.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eafc97cce85fa735f73541e4fcdb7d380bf5d828b6e1eabe47dc03774e847724 +size 3786695 diff --git a/BZOJ/4127/data/5.out b/BZOJ/4127/data/5.out new file mode 100644 index 00000000..7ca8a540 --- /dev/null +++ b/BZOJ/4127/data/5.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89864e75507358d16b41f04797ccf7dae012e9f69e43e0b2e7f745dee78869fe +size 652086 diff --git a/BZOJ/4127/data/6.in b/BZOJ/4127/data/6.in new file mode 100644 index 00000000..5ff6e775 --- /dev/null +++ b/BZOJ/4127/data/6.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5a28941a3c1db5a2c31b53b46b0bcbd86dfbcdde6e1655c205647e406412ed4 +size 3735891 diff --git a/BZOJ/4127/data/6.out b/BZOJ/4127/data/6.out new file mode 100644 index 00000000..d20d409a --- /dev/null +++ b/BZOJ/4127/data/6.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bebd4227ef84c731825c34c51b5759220663fa9df42c7eec686041f3df084a02 +size 719222 diff --git a/BZOJ/4127/data/7.in b/BZOJ/4127/data/7.in new file mode 100644 index 00000000..a829bfc5 --- /dev/null +++ b/BZOJ/4127/data/7.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2755c6c5a880f0a36cf35ec3c345fa41c98628f46b6af274f7a9e882aafa32e +size 3785716 diff --git a/BZOJ/4127/data/7.out b/BZOJ/4127/data/7.out new file mode 100644 index 00000000..424ddc51 --- /dev/null +++ b/BZOJ/4127/data/7.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3924515153fa164db93b6015995080a0e5213f4c7d2dc737d111bed633f6bf8f +size 635688 diff --git a/BZOJ/4127/data/8.in b/BZOJ/4127/data/8.in new file mode 100644 index 00000000..31f089e5 --- /dev/null +++ b/BZOJ/4127/data/8.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70fb7f7badf49ab69c6af8c0e6401293e3ee32f5180a8bc0c73013746ecdd118 +size 20896 diff --git a/BZOJ/4127/data/8.out b/BZOJ/4127/data/8.out new file mode 100644 index 00000000..e54dba47 --- /dev/null +++ b/BZOJ/4127/data/8.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:957f9eb515994d4fa96cd438b769c84478906118ac69353d83eae1de11498152 +size 2280 diff --git a/BZOJ/4127/data/9.in b/BZOJ/4127/data/9.in new file mode 100644 index 00000000..b9c937da --- /dev/null +++ b/BZOJ/4127/data/9.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4c4e68ef3871d60144b209e6800f003b1a2f62232d4f4acd2fbd8c89c1e2e4e +size 3785762 diff --git a/BZOJ/4127/data/9.out b/BZOJ/4127/data/9.out new file mode 100644 index 00000000..b53b8ec8 --- /dev/null +++ b/BZOJ/4127/data/9.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55cc73194906e10493eac745ae8091a4c3203d3c5ac163eda924b4814017aa0d +size 633978