diff --git a/BZOJ/2243/2243.cpp b/BZOJ/2243/2243.cpp new file mode 100644 index 00000000..7a1b6388 --- /dev/null +++ b/BZOJ/2243/2243.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]; + +// Link-cut Tree +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; +} + +// === Link-cut Tree === + +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/BZOJ/2243/data/1.in b/BZOJ/2243/data/1.in new file mode 100644 index 00000000..0568dc8a --- /dev/null +++ b/BZOJ/2243/data/1.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b6e0099481f3827ee08f464381491cc3b84e357d3a43ff21762caacbe7980c0 +size 1289468 diff --git a/BZOJ/2243/data/1.out b/BZOJ/2243/data/1.out new file mode 100644 index 00000000..b6f80adf --- /dev/null +++ b/BZOJ/2243/data/1.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e98c66a84b43bfdfb283b05668e2e7a90630b6b996ad3c11f795dd754ce59abb +size 89316 diff --git a/BZOJ/2243/data/10.in b/BZOJ/2243/data/10.in new file mode 100644 index 00000000..c4ec2f66 --- /dev/null +++ b/BZOJ/2243/data/10.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ade1e2320f27538c2446628aecaa8376690ae9f97bf8064c5c0da95aeec89c4d +size 2468626 diff --git a/BZOJ/2243/data/10.out b/BZOJ/2243/data/10.out new file mode 100644 index 00000000..568f28b9 --- /dev/null +++ b/BZOJ/2243/data/10.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd73fb6c43895e3917b0841fb536b3c86d8094d39e091c2bd44df136532c5b7e +size 95232 diff --git a/BZOJ/2243/data/11.in b/BZOJ/2243/data/11.in new file mode 100644 index 00000000..c63573c7 --- /dev/null +++ b/BZOJ/2243/data/11.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec607ca8b013d8384d94ce1817bc028138bcd597420128e7f38cb140f3351ead +size 2802785 diff --git a/BZOJ/2243/data/11.out b/BZOJ/2243/data/11.out new file mode 100644 index 00000000..028a14e9 --- /dev/null +++ b/BZOJ/2243/data/11.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdfcca6176b83fccc2da093103162f61a334cd3ca9a945465959ec4355bb5e12 +size 71825 diff --git a/BZOJ/2243/data/12.in b/BZOJ/2243/data/12.in new file mode 100644 index 00000000..a2c6c799 --- /dev/null +++ b/BZOJ/2243/data/12.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0f1f7129a912e2beec728cbb8ed13c5f87444442fc19061a6e0d6816e434baa +size 1693692 diff --git a/BZOJ/2243/data/12.out b/BZOJ/2243/data/12.out new file mode 100644 index 00000000..b0cf205c --- /dev/null +++ b/BZOJ/2243/data/12.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aaef2a2159d9d8fd7a09cd1efa5d935e178c656d6f3dbef4ac8197440285016e +size 95538 diff --git a/BZOJ/2243/data/13.in b/BZOJ/2243/data/13.in new file mode 100644 index 00000000..314ac053 --- /dev/null +++ b/BZOJ/2243/data/13.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8344008990e43f3e8c4894510bf538ecfd71a432fc859b1a1489ce69ccb2e33 +size 1923580 diff --git a/BZOJ/2243/data/13.out b/BZOJ/2243/data/13.out new file mode 100644 index 00000000..1c5ef37f --- /dev/null +++ b/BZOJ/2243/data/13.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc506c218e716dbb1499d47d78273054923b0fd7041f1f7c7b9f0d9bffa1ff19 +size 58817 diff --git a/BZOJ/2243/data/14.in b/BZOJ/2243/data/14.in new file mode 100644 index 00000000..617dc373 --- /dev/null +++ b/BZOJ/2243/data/14.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:638363ef826a512aafe269cf18d1e95d2e4a5ae100c7d079ea6daf47cbe6e951 +size 2068801 diff --git a/BZOJ/2243/data/14.out b/BZOJ/2243/data/14.out new file mode 100644 index 00000000..a37bd80b --- /dev/null +++ b/BZOJ/2243/data/14.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fe2e0c03a78cd2a2c439ebb21c6b1eb09db771df06719af76a2163a6e2d0754 +size 1334 diff --git a/BZOJ/2243/data/15.in b/BZOJ/2243/data/15.in new file mode 100644 index 00000000..5abb7bd2 --- /dev/null +++ b/BZOJ/2243/data/15.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b82e71eba8a52c80ac4da79cdbccc37933fd4752e535929d5727e5ef5e21ce83 +size 1338920 diff --git a/BZOJ/2243/data/15.out b/BZOJ/2243/data/15.out new file mode 100644 index 00000000..f2294471 --- /dev/null +++ b/BZOJ/2243/data/15.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fb062a4b9037faaeb0e3643568be0647aac8eb6650bc7e0ed208b2d0ccfea64 +size 5308 diff --git a/BZOJ/2243/data/16.in b/BZOJ/2243/data/16.in new file mode 100644 index 00000000..c3b04db8 --- /dev/null +++ b/BZOJ/2243/data/16.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63c21e627ad38b19a436ddac4580f98f8abde242d2980b803a87a673085e1941 +size 813230 diff --git a/BZOJ/2243/data/16.out b/BZOJ/2243/data/16.out new file mode 100644 index 00000000..872fed25 --- /dev/null +++ b/BZOJ/2243/data/16.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca1aa3321961466c1ae2dd68ac13669b94c738ac7d325ca3e5aff0ae530b921f +size 64728 diff --git a/BZOJ/2243/data/17.in b/BZOJ/2243/data/17.in new file mode 100644 index 00000000..98894320 --- /dev/null +++ b/BZOJ/2243/data/17.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:002866c8f774872f2860d88a849797d2ec1dc73b5e417983bd62f70fda8807db +size 2300078 diff --git a/BZOJ/2243/data/17.out b/BZOJ/2243/data/17.out new file mode 100644 index 00000000..7b4f17e6 --- /dev/null +++ b/BZOJ/2243/data/17.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d56c893d76a48992974183610fa0b2709841aecf12644f62f5f2d40566695bd +size 66690 diff --git a/BZOJ/2243/data/18.in b/BZOJ/2243/data/18.in new file mode 100644 index 00000000..70844e46 --- /dev/null +++ b/BZOJ/2243/data/18.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63331e6dfda9968f3dd796ab65453d203f96eac2ccca7cc5e502bac445e3dab8 +size 2591867 diff --git a/BZOJ/2243/data/18.out b/BZOJ/2243/data/18.out new file mode 100644 index 00000000..16d50a13 --- /dev/null +++ b/BZOJ/2243/data/18.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdb735bc6b78bd5cd1795044a31a51bebf0e3cf86a97db571d442c5b4937841d +size 83495 diff --git a/BZOJ/2243/data/19.in b/BZOJ/2243/data/19.in new file mode 100644 index 00000000..45c1b239 --- /dev/null +++ b/BZOJ/2243/data/19.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b61c9a3cb82b82f7b569e55e39f6fe3c02ecb5695a65c98712627dddc701403d +size 1552034 diff --git a/BZOJ/2243/data/19.out b/BZOJ/2243/data/19.out new file mode 100644 index 00000000..646f9836 --- /dev/null +++ b/BZOJ/2243/data/19.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da93f2e65c2a693d6ccaa5e188c44da26c370dc59c0b542b45ccde2dcf9d641c +size 113 diff --git a/BZOJ/2243/data/2.in b/BZOJ/2243/data/2.in new file mode 100644 index 00000000..d328e4d9 --- /dev/null +++ b/BZOJ/2243/data/2.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f658c293d8e3d01d29f5a60b9a8b45181931ef321ec41c49ffc4560bc3ca8a20 +size 3527258 diff --git a/BZOJ/2243/data/2.out b/BZOJ/2243/data/2.out new file mode 100644 index 00000000..40ba95b6 --- /dev/null +++ b/BZOJ/2243/data/2.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d573ac1f78c58aa587a24666ee41e9bd732e42dc2ec101fb96254d279bcb1c2b +size 93590 diff --git a/BZOJ/2243/data/20.in b/BZOJ/2243/data/20.in new file mode 100644 index 00000000..19dbace0 --- /dev/null +++ b/BZOJ/2243/data/20.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83f1ca03e565660ca16c85805b75d69ccd3c8f04d72001723c59ca61255ea91a +size 1735063 diff --git a/BZOJ/2243/data/20.out b/BZOJ/2243/data/20.out new file mode 100644 index 00000000..bead03e9 --- /dev/null +++ b/BZOJ/2243/data/20.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88b5059fbcf479cd1f5eb7c0b87102f741f98796c3a80228f2cdf87e4cde1161 +size 7361 diff --git a/BZOJ/2243/data/3.in b/BZOJ/2243/data/3.in new file mode 100644 index 00000000..f891d49a --- /dev/null +++ b/BZOJ/2243/data/3.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d039201fea08bb774a23002f1a5594f2f2a65a387e021881502ed4d8d9797b34 +size 853343 diff --git a/BZOJ/2243/data/3.out b/BZOJ/2243/data/3.out new file mode 100644 index 00000000..b06d4bea --- /dev/null +++ b/BZOJ/2243/data/3.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49883f06fc7b94a318a401e56e22cc074adcee056374f6610aa3394ae1b486a5 +size 562 diff --git a/BZOJ/2243/data/4.in b/BZOJ/2243/data/4.in new file mode 100644 index 00000000..8bf0520a --- /dev/null +++ b/BZOJ/2243/data/4.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68d18ecb86c410745e57d5a2cb5a36d0d094ddf36f684a33a2055f28e383e392 +size 2623703 diff --git a/BZOJ/2243/data/4.out b/BZOJ/2243/data/4.out new file mode 100644 index 00000000..fd50de33 --- /dev/null +++ b/BZOJ/2243/data/4.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb10f7218fa5529ac9f5614c3ea87d3621045ab5e039502a04332b955c024753 +size 84982 diff --git a/BZOJ/2243/data/5.in b/BZOJ/2243/data/5.in new file mode 100644 index 00000000..23d8b9d8 --- /dev/null +++ b/BZOJ/2243/data/5.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13c0f8bb2d8abcc7028a034d6d871f994fa161ef50d9b9c4b6c5bb70e6e2eb77 +size 2002339 diff --git a/BZOJ/2243/data/5.out b/BZOJ/2243/data/5.out new file mode 100644 index 00000000..7c886a6e --- /dev/null +++ b/BZOJ/2243/data/5.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e667933b040dc6284aef6c323c086478a0597dae7b5ccb051ea70e8aae0e44d +size 78924 diff --git a/BZOJ/2243/data/6.in b/BZOJ/2243/data/6.in new file mode 100644 index 00000000..ce25d89a --- /dev/null +++ b/BZOJ/2243/data/6.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7a029554fac965f0811c03213502e79c6ed53d9e5237eb770057562af62adb6 +size 1917072 diff --git a/BZOJ/2243/data/6.out b/BZOJ/2243/data/6.out new file mode 100644 index 00000000..003ca1e6 --- /dev/null +++ b/BZOJ/2243/data/6.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:599ae5fe2083790ed468f651962bf72a217ae6029688efbc3030d5a05cf4c6ad +size 79269 diff --git a/BZOJ/2243/data/7.in b/BZOJ/2243/data/7.in new file mode 100644 index 00000000..93c70a0d --- /dev/null +++ b/BZOJ/2243/data/7.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2d156e111caf5b3ef434da3350489f15b0070c8317141581c42446b2b3ce9ed +size 1577377 diff --git a/BZOJ/2243/data/7.out b/BZOJ/2243/data/7.out new file mode 100644 index 00000000..eeb58432 --- /dev/null +++ b/BZOJ/2243/data/7.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6aee1d2b580b7a201d25640be5a69687c50cb0fc297f114e1f3f09c8a4199ea +size 11266 diff --git a/BZOJ/2243/data/8.in b/BZOJ/2243/data/8.in new file mode 100644 index 00000000..a279b789 --- /dev/null +++ b/BZOJ/2243/data/8.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ec9c7351ec199f951fc6fce7d8b5158f919cef2a8f2883cc121208dd2f1772 +size 1602618 diff --git a/BZOJ/2243/data/8.out b/BZOJ/2243/data/8.out new file mode 100644 index 00000000..4d13bff1 --- /dev/null +++ b/BZOJ/2243/data/8.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88a22b5d9edccea17b420e7ddb38ef30f3f7dd31266f239f225fee5c4ae35a12 +size 725 diff --git a/BZOJ/2243/data/9.in b/BZOJ/2243/data/9.in new file mode 100644 index 00000000..7aa6bdf9 --- /dev/null +++ b/BZOJ/2243/data/9.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28cfc118311a73e85d6437b4b339bb9ce01762d8dbe4a943bc974574a81d28a1 +size 2329861 diff --git a/BZOJ/2243/data/9.out b/BZOJ/2243/data/9.out new file mode 100644 index 00000000..77922791 --- /dev/null +++ b/BZOJ/2243/data/9.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebe925b37b8da1974f58a6deb213427a1c5ff854a84dc175af83b18fb3a1822d +size 56151