diff --git a/LibreOJ/10141/10141.cpp b/LibreOJ/10141/10141.cpp new file mode 100644 index 00000000..cf569c96 --- /dev/null +++ b/LibreOJ/10141/10141.cpp @@ -0,0 +1,174 @@ +#include + +using namespace std; + +const int N = 100005; + +int n, m, u, v, c, color[N]; +char op; +vector g[N]; + +// Heavy Path Decomposition +int cnt, dep[N], id[N], siz[N], fa[N], son[N], top[N], w[N]; +void dfs1(int, int); +void dfs2(int u, int t); +void modify_path(int, int, int); +int query_path(int, int); + +// Segment Tree +void pushup(int); +void pushdown(int); +void build(int, int, int); +void modify(int, int, int, int); +int query_sum(int, int, int); +int query_color(int, int); + +int main() { + cin >> n >> m; + for (int i = 1; i <= n; i++) { + cin >> color[i]; + } + for (int i = 1; i < n; i++) { + cin >> u >> v; + g[u].push_back(v); + g[v].push_back(u); + } + dfs1(1, 0); + dfs2(1, 1); + build(1, 1, n); + while (m--) { + cin >> op >> u >> v; + if (op == 'C') { + cin >> c; + modify_path(u, v, c); + } else { + cout << query_path(u, v) << endl; + } + } + return 0; +} + +// === Heavy Path Decomposition === + +void dfs1(int u, int f) { + dep[u] = dep[f] + 1; + fa[u] = f; + 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; + w[cnt] = color[u]; + top[u] = t; + if (!son[u]) return; + dfs2(son[u], t); + for (int v : g[u]) { + if (v == fa[u]) continue; + if (v == son[u]) continue; + dfs2(v, v); + } +} + +void modify_path(int u, int v, int c) { + while (top[u] != top[v]) { + if (dep[top[u]] < dep[top[v]]) swap(u, v); + modify(1, id[top[u]], id[u], c); + u = fa[top[u]]; + } + if (dep[u] < dep[v]) swap(u, v); + modify(1, id[v], id[u], c); +} + +int query_path(int u, int v) { + int res = 0; + while (top[u] != top[v]) { + if (dep[top[u]] < dep[top[v]]) swap(u, v); + res += query_sum(1, id[top[u]], id[u]); + res -= (query_color(1, id[top[u]]) == query_color(1, id[fa[top[u]]])); + u = fa[top[u]]; + } + if (dep[u] < dep[v]) swap(u, v); + res += query_sum(1, id[v], id[u]); + return res; +} + +// === Segment Tree === + +struct node { + int l, r, s, d, lc, rc; + + node() + : l(0), r(0), s(0), d(0), lc(0), rc(0) {} + node(int _l, int _r) + : l(_l), r(_r), s(0), d(0), lc(0), rc(0) {} +} tr[N << 2]; + +inline void pushup(int u) { + tr[u].s = tr[u << 1].s + tr[u << 1 | 1].s - (tr[u << 1].rc == tr[u << 1 | 1].lc); + tr[u].lc = tr[u << 1].lc; + tr[u].rc = tr[u << 1 | 1].rc; +} + +inline void pushdown(int u) { + auto &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1]; + if (!tr[u].d) return; + left.d = right.d = root.d; + left.lc = left.rc = right.lc = right.rc = root.d; + left.s = right.s = 1; + root.d = 0; +} + +void build(int u, int l, int r) { + tr[u] = node(l, r); + if (l == r) { + tr[u].lc = tr[u].rc = w[l]; + tr[u].s = 1; + return; + } + int mid = l + r >> 1; + build(u << 1, l, mid); + build(u << 1 | 1, mid + 1, r); + pushup(u); +} + +void modify(int u, int l, int r, int c) { + if (l <= tr[u].l && tr[u].r <= r) { + tr[u].d = tr[u].lc = tr[u].rc = c; + tr[u].s = 1; + return; + } + pushdown(u); + int mid = tr[u].l + tr[u].r >> 1; + if (l <= mid) modify(u << 1, l, r, c); + if (r > mid) modify(u << 1 | 1, l, r, c); + pushup(u); +} + +int query_sum(int u, int l, int r) { + if (l <= tr[u].l && tr[u].r <= r) { + return tr[u].s; + } + int mid = tr[u].l + tr[u].r >> 1; + int res = 0; + pushdown(u); + if (l <= mid) res += query_sum(u << 1, l, r); + if (r > mid) res += query_sum(u << 1 | 1, l, r); + if (l <= mid && r > mid) res -= (tr[u << 1].rc == tr[u << 1 | 1].lc); + return res; +} + +int query_color(int u, int x) { + if (tr[u].l == x && tr[u].r == x) { + return tr[u].lc; + } + int mid = tr[u].l + tr[u].r >> 1; + pushdown(u); + if (x <= mid) return query_color(u << 1, x); + return query_color(u << 1 | 1, x); +} diff --git a/LibreOJ/10141/data/paint1.in b/LibreOJ/10141/data/paint1.in new file mode 100644 index 00000000..8b4f0f92 --- /dev/null +++ b/LibreOJ/10141/data/paint1.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3396d01f233138d3334093b62e5d20664f852d82baf7e6d1351b2cfc6a366440 +size 2143307 diff --git a/LibreOJ/10141/data/paint1.out b/LibreOJ/10141/data/paint1.out new file mode 100644 index 00000000..bad0eedf --- /dev/null +++ b/LibreOJ/10141/data/paint1.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9f2a3286532bcf553f5cadfb5681ebc38b8954a41d1e3559fbd64a7d179e2dc +size 118349 diff --git a/LibreOJ/10141/data/paint10.in b/LibreOJ/10141/data/paint10.in new file mode 100644 index 00000000..af100fb9 --- /dev/null +++ b/LibreOJ/10141/data/paint10.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a54fd81d906c6d0e9ed760c0f141d74eb5a885aa393e1704085dea3d0fec93ff +size 1828843 diff --git a/LibreOJ/10141/data/paint10.out b/LibreOJ/10141/data/paint10.out new file mode 100644 index 00000000..8b342a74 --- /dev/null +++ b/LibreOJ/10141/data/paint10.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c023c4f6a46e5dead90a5fd5df1dd49c07b474377eb47d339b4d8daa1ba9f5b +size 10158 diff --git a/LibreOJ/10141/data/paint11.in b/LibreOJ/10141/data/paint11.in new file mode 100644 index 00000000..27aaa102 --- /dev/null +++ b/LibreOJ/10141/data/paint11.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1b9c1568ee35358b46d8e9c15e3d79c635bc30968cf324bbd2cd8b9a389ca58 +size 1624917 diff --git a/LibreOJ/10141/data/paint11.out b/LibreOJ/10141/data/paint11.out new file mode 100644 index 00000000..db8f1d72 --- /dev/null +++ b/LibreOJ/10141/data/paint11.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:938a2604a4b47011ac6e17e35d1f527dee05312b859af93492d5bb26f946a29f +size 162 diff --git a/LibreOJ/10141/data/paint12.in b/LibreOJ/10141/data/paint12.in new file mode 100644 index 00000000..66bb06e8 --- /dev/null +++ b/LibreOJ/10141/data/paint12.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5294abfea349ca59f03bd3f1da10801f06f0b64d784c79d1e69c252241afdb4c +size 1677115 diff --git a/LibreOJ/10141/data/paint12.out b/LibreOJ/10141/data/paint12.out new file mode 100644 index 00000000..4bffdb6b --- /dev/null +++ b/LibreOJ/10141/data/paint12.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7228ba05b2fc8bd34d73ddb654abde88e2641f335a9b4e3e11b2a10510024ff +size 1076 diff --git a/LibreOJ/10141/data/paint13.in b/LibreOJ/10141/data/paint13.in new file mode 100644 index 00000000..85f06c03 --- /dev/null +++ b/LibreOJ/10141/data/paint13.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce0151a60ccda645ea0feb158f9368508e34f055657844818f50e33fd79c0b51 +size 1402369 diff --git a/LibreOJ/10141/data/paint13.out b/LibreOJ/10141/data/paint13.out new file mode 100644 index 00000000..2197463a --- /dev/null +++ b/LibreOJ/10141/data/paint13.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c696895c13569ff2ce36521d84972b2f683476ddfee7f0e5059ecd8686d9ed7f +size 7928 diff --git a/LibreOJ/10141/data/paint14.in b/LibreOJ/10141/data/paint14.in new file mode 100644 index 00000000..8f77bfda --- /dev/null +++ b/LibreOJ/10141/data/paint14.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de77dfcf51748f88295f37bf6cba68aaae0d24c3e229ad7c9f9888e35c2f55d2 +size 2462280 diff --git a/LibreOJ/10141/data/paint14.out b/LibreOJ/10141/data/paint14.out new file mode 100644 index 00000000..5ddadad2 --- /dev/null +++ b/LibreOJ/10141/data/paint14.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb47e3e3ab37cdaec69f6b19c0afb1b5109168713e01cefc7d32f5a0cb0a9ba4 +size 99999 diff --git a/LibreOJ/10141/data/paint15.in b/LibreOJ/10141/data/paint15.in new file mode 100644 index 00000000..98dfefd1 --- /dev/null +++ b/LibreOJ/10141/data/paint15.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36cb1084e52d9f83f615e74d66e2d0c16287ae933f308cdcfc2601a0a8fe361b +size 2724708 diff --git a/LibreOJ/10141/data/paint15.out b/LibreOJ/10141/data/paint15.out new file mode 100644 index 00000000..c428f57f --- /dev/null +++ b/LibreOJ/10141/data/paint15.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23251b885d81b1d6ed810adaf4bea3c12d9e0bb9d94c6d1afdf4df5bc8b8cf97 +size 124697 diff --git a/LibreOJ/10141/data/paint16.in b/LibreOJ/10141/data/paint16.in new file mode 100644 index 00000000..4962202f --- /dev/null +++ b/LibreOJ/10141/data/paint16.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e929c8475cdc6a4e69d474c74f1fc52f091a0cb7dc967ea98eb30e8b91c3a37 +size 2941923 diff --git a/LibreOJ/10141/data/paint16.out b/LibreOJ/10141/data/paint16.out new file mode 100644 index 00000000..c9062279 --- /dev/null +++ b/LibreOJ/10141/data/paint16.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:873ad03c20231505da5ec48d293ea3a138db01b52088c234389856ecc1f00b8b +size 107357 diff --git a/LibreOJ/10141/data/paint17.in b/LibreOJ/10141/data/paint17.in new file mode 100644 index 00000000..0b3c36d1 --- /dev/null +++ b/LibreOJ/10141/data/paint17.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:501c808aebe542833487b59a433325ec671f80bc8de764a9c47c36942106cb0f +size 2757724 diff --git a/LibreOJ/10141/data/paint17.out b/LibreOJ/10141/data/paint17.out new file mode 100644 index 00000000..1bdaa949 --- /dev/null +++ b/LibreOJ/10141/data/paint17.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdd4128cb93c846916d7e22ea555c781ce56ba36ed1d7d3b79be6e4e37e5850d +size 126897 diff --git a/LibreOJ/10141/data/paint18.in b/LibreOJ/10141/data/paint18.in new file mode 100644 index 00000000..1211de43 --- /dev/null +++ b/LibreOJ/10141/data/paint18.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f0ee85db7d331a415a35b20f2651b91db94dd8413b24522f657aa3fb9c75608 +size 878149 diff --git a/LibreOJ/10141/data/paint18.out b/LibreOJ/10141/data/paint18.out new file mode 100644 index 00000000..bc37f3fc --- /dev/null +++ b/LibreOJ/10141/data/paint18.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18ad2a06f87ba62d7292f10422ba64ff57bf43f46f3c2a97fa29c6e9990f8a9f +size 97043 diff --git a/LibreOJ/10141/data/paint19.in b/LibreOJ/10141/data/paint19.in new file mode 100644 index 00000000..2b69b204 --- /dev/null +++ b/LibreOJ/10141/data/paint19.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6374d9c15f9168060072b3af990e18ef01d46d50a0a82da2bdcc77a3bdc2d622 +size 1378612 diff --git a/LibreOJ/10141/data/paint19.out b/LibreOJ/10141/data/paint19.out new file mode 100644 index 00000000..1f8550f3 --- /dev/null +++ b/LibreOJ/10141/data/paint19.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3e6d4c9d57abb4aceec85d87b5a59898c770d595c9ad91055aa6531af5f15c0 +size 133569 diff --git a/LibreOJ/10141/data/paint2.in b/LibreOJ/10141/data/paint2.in new file mode 100644 index 00000000..e26e2f18 --- /dev/null +++ b/LibreOJ/10141/data/paint2.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5edc7bfda43ee2a7ebdbc1eedd4a6f1420bf309477bd347ac28fed7ee88329b +size 2046486 diff --git a/LibreOJ/10141/data/paint2.out b/LibreOJ/10141/data/paint2.out new file mode 100644 index 00000000..9275c9fc --- /dev/null +++ b/LibreOJ/10141/data/paint2.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49040e10cc3b91c170198648b27641551966c29ff34b5125c9e245b45ac13b5d +size 118585 diff --git a/LibreOJ/10141/data/paint20.in b/LibreOJ/10141/data/paint20.in new file mode 100644 index 00000000..52be5e5a --- /dev/null +++ b/LibreOJ/10141/data/paint20.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e67b1a27e3fc3eee8a656527b86b2cc1bd82acdd6bdd5665d44c2d64cec02f6e +size 1795039 diff --git a/LibreOJ/10141/data/paint20.out b/LibreOJ/10141/data/paint20.out new file mode 100644 index 00000000..b4d27594 --- /dev/null +++ b/LibreOJ/10141/data/paint20.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad594e02e21d4c0c348c3f0e6c4d398d1cc0051e59ad0371031ca6ef97694b76 +size 142708 diff --git a/LibreOJ/10141/data/paint3.in b/LibreOJ/10141/data/paint3.in new file mode 100644 index 00000000..fc0dfabe --- /dev/null +++ b/LibreOJ/10141/data/paint3.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06437e39dbe182af195ad821fbdfcf2cbf5c945fa2934be0d7cc0e979d1f16fd +size 2477683 diff --git a/LibreOJ/10141/data/paint3.out b/LibreOJ/10141/data/paint3.out new file mode 100644 index 00000000..ce9d34c5 --- /dev/null +++ b/LibreOJ/10141/data/paint3.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fce7a3531575efd6a065734415c9cda138c3cf5c95064ba0fb2e9a162f150f75 +size 84082 diff --git a/LibreOJ/10141/data/paint4.in b/LibreOJ/10141/data/paint4.in new file mode 100644 index 00000000..4ddf8938 --- /dev/null +++ b/LibreOJ/10141/data/paint4.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a75ef050c7e3b6a0c3ce8273e9dd92b94ff7a4f0f5c3c04cbe9057217188ec1 +size 2614530 diff --git a/LibreOJ/10141/data/paint4.out b/LibreOJ/10141/data/paint4.out new file mode 100644 index 00000000..db2d2a06 --- /dev/null +++ b/LibreOJ/10141/data/paint4.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:827bc54fd6d5ccb7131f488d31818b9584631c8c130abd0e065e2f035c844b8b +size 142527 diff --git a/LibreOJ/10141/data/paint5.in b/LibreOJ/10141/data/paint5.in new file mode 100644 index 00000000..33ebfa63 --- /dev/null +++ b/LibreOJ/10141/data/paint5.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6975f7f52a7c22e3bbf6ad54a11c6a89ab72f6179d300f76ffbcc76523e600d3 +size 2033618 diff --git a/LibreOJ/10141/data/paint5.out b/LibreOJ/10141/data/paint5.out new file mode 100644 index 00000000..408ce781 --- /dev/null +++ b/LibreOJ/10141/data/paint5.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40453a4cf59fd11a40f774b18d6914e29b95d7efda47d931897f5009d5976200 +size 88116 diff --git a/LibreOJ/10141/data/paint6.in b/LibreOJ/10141/data/paint6.in new file mode 100644 index 00000000..fb5efce3 --- /dev/null +++ b/LibreOJ/10141/data/paint6.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fb106cfbd24c7e1e705ef2ef76d8a1cf60d0065d64c606e1ae86a555d7d9728 +size 3704631 diff --git a/LibreOJ/10141/data/paint6.out b/LibreOJ/10141/data/paint6.out new file mode 100644 index 00000000..87c9f6fe --- /dev/null +++ b/LibreOJ/10141/data/paint6.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea36ce6825b8b04ed9b8f24266d946165db4d80cbebf10710cbcb17e4997bd86 +size 140128 diff --git a/LibreOJ/10141/data/paint7.in b/LibreOJ/10141/data/paint7.in new file mode 100644 index 00000000..00ec9d31 --- /dev/null +++ b/LibreOJ/10141/data/paint7.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:742ca31b1fc2db7c954cf9f02836320dbe57e16363bd395b67a04f2ffbc8a88e +size 915811 diff --git a/LibreOJ/10141/data/paint7.out b/LibreOJ/10141/data/paint7.out new file mode 100644 index 00000000..e4c5cbbf --- /dev/null +++ b/LibreOJ/10141/data/paint7.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0ff0a374c58573f8a8fd8fd86158264c65e409f7e1f6851e7ec3ed08bb159be +size 819 diff --git a/LibreOJ/10141/data/paint8.in b/LibreOJ/10141/data/paint8.in new file mode 100644 index 00000000..8f159935 --- /dev/null +++ b/LibreOJ/10141/data/paint8.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e0de27a10d8c5a4a556dc7f27fe411fe6bc8f21f1f46b36eddcef41e5462050 +size 2164579 diff --git a/LibreOJ/10141/data/paint8.out b/LibreOJ/10141/data/paint8.out new file mode 100644 index 00000000..7e58bb16 --- /dev/null +++ b/LibreOJ/10141/data/paint8.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:213c7117f948060f18f2ff4bf461363923dad3e96ab43fa17d54df6b0e7d8b81 +size 1798 diff --git a/LibreOJ/10141/data/paint9.in b/LibreOJ/10141/data/paint9.in new file mode 100644 index 00000000..3194531d --- /dev/null +++ b/LibreOJ/10141/data/paint9.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64ec0bdc37446505ee7cbca8ca9247a96ea6241fe4307566602a4f76960a9553 +size 1678691 diff --git a/LibreOJ/10141/data/paint9.out b/LibreOJ/10141/data/paint9.out new file mode 100644 index 00000000..0a054379 --- /dev/null +++ b/LibreOJ/10141/data/paint9.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:911106fc9c71aad0e9d9675074833d0b39588dce2d3ba10133e4a25597853aa4 +size 15472