「WC2013」糖果公园

「WC2013」糖果公园

传送门
树上带修莫队板子题。
看懂题意后就是板子题了。
参考代码:

#include <algorithm>
#include <cstdio>
#include <cmath>
#define rg register
#define int long long
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using std ::sort; using std ::swap;
template < class T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while ('0' > c || c > '9') f |= c == '-', c = getchar();
    while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
    s = f ? -s : s;
}

const int _ = 100010;

int tot, head[_]; struct Edge { int ver, nxt; } edge[_ << 1];
inline void Add_edge(int u, int v) { edge[++tot] = (Edge) { v, head[u] }, head[u] = tot; }

int n, m, q, v[_], w[_], c[_];
int gap, pos[_ << 1], cnt[_], ans, res[_];
int len, vis[_], ord[_ << 1], fir[_], las[_];
int dep[_], son[_], siz[_], top[_], fa[_];
int Cnum; struct Change { int x, y; } C[_];
int Qnum; struct Query { int l, r, lca, t, id; } Q[_];
inline bool cmp(const Query& x, const Query& y)
{ return pos[x.l] ^ pos[y.l] ? pos[x.l] < pos[y.l] : (pos[x.r] ^ pos[y.r] ? pos[x.r] < pos[y.r] : x.t < y.t); }

inline void dfs(int u, int f) {
    dep[u] = dep[f] + 1, siz[u] = 1, fa[u] = f;
    ord[fir[u] = ++len] = u;
    for (rg int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].ver; if (v == f) continue ;
    dfs(v, u), siz[u] += siz[v];
    if (siz[v] > siz[son[u]]) son[u] = v;
    }
    ord[las[u] = ++len] = u;
}

inline void dfs(int u, int f, int topf) {
    top[u] = topf;
    if (son[u]) dfs(son[u], u, topf);
    for (rg int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].ver; if (v == f || v == son[u]) continue ;
    dfs(v, u, v);
    }
}

inline int LCA(int x, int y) {
    int fx = top[x], fy = top[y];
    while (fx != fy) {
    if (dep[fx] < dep[fy]) swap(x, y), swap(fx, fy);
    x = fa[fx], fx = top[x];
    }
    return dep[x] < dep[y] ? x : y;
}

inline void calc(int x) { vis[x] ? ans -= 1ll * w[cnt[c[x]]--] * v[c[x]] : ans += 1ll * w[++cnt[c[x]]] * v[c[x]], vis[x] ^= 1; }

inline void work(int tim) {
    if (vis[C[tim].x])
    ans += 1ll * w[++cnt[C[tim].y]] * v[C[tim].y] - 1ll * w[cnt[c[C[tim].x]]--] * v[c[C[tim].x]];
    swap(c[C[tim].x], C[tim].y);
}

signed main() {
    read(n), read(m), read(q);
    for (rg int i = 1; i <= m; ++i) read(v[i]);
    for (rg int i = 1; i <= n; ++i) read(w[i]);
    for (rg int x, y, i = 1; i < n; ++i) read(x), read(y), Add_edge(x, y), Add_edge(y, x);
    for (rg int i = 1; i <= n; ++i) read(c[i]);
    dfs(1, 0), dfs(1, 0, 1), gap = (long long) pow(len, 2.0 / 3.0);
    for (rg int i = 1; i <= len; ++i) pos[i] = (i - 1) / gap + 1;
    for (rg int type, x, y, i = 1; i <= q; ++i) {
        read(type), read(x), read(y);
        if (type == 0) C[++Cnum] = (Change) { x, y };
        else {
            if (fir[x] > fir[y]) swap(x, y);
            int lca = LCA(x, y);
            if (x == lca)
                Q[++Qnum] = (Query) { fir[x], fir[y], 0, Cnum, Qnum };
            else
                Q[++Qnum] = (Query) { las[x], fir[y], lca, Cnum, Qnum };
        }
    }
    sort(Q + 1, Q + Qnum + 1, cmp);
    for (rg int l = 1, r = 0, tim = 0, i = 1; i <= Qnum; ++i) {
        while (l > Q[i].l) calc(ord[--l]);
        while (l < Q[i].l) calc(ord[l++]);
        while (r < Q[i].r) calc(ord[++r]);
        while (r > Q[i].r) calc(ord[r--]);
        while (tim < Q[i].t) work(++tim);
        while (tim > Q[i].t) work(tim--);
        if (Q[i].lca) calc(Q[i].lca);
        res[Q[i].id] = ans;
        if (Q[i].lca) calc(Q[i].lca);
    }
    for (rg int i = 1; i <= Qnum; ++i) printf("%lld\n", res[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/zsbzsb/p/12231731.html

时间: 2024-12-20 06:35:44

「WC2013」糖果公园的相关文章

[WC2013][UOJ58]糖果公园 莫队算法

这道题有毒!!!!!!!!!!!!!!!!!! 先贴个题面吧QwQ #58. [WC2013]糖果公园 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩. 糖果公园的结构十分奇特,它由 nn 个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为 11 至 nn.有 n?1n?1 条双向道路连接着这些游览点,并且整个糖果公园都是连通的,即从任何一个游览点出发都可以通过这些道路到达公园里的所有

【WC2013】 糖果公园 - 树上莫队

[问题描述] Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩.糖果公园的结构十分奇特,它由 n 个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为 1 至 n.有 n – 1 条 双向道路 连接着这些游览点,并且整个糖果公园都是 连通的 ,即从任何一个游览点出发都可以通过这些道路到达公园里的所有其它游览点.糖果公园所发放的糖果种类非常丰富,总共有 m 种,它们的编号依次为 1至 m.

【BZOJ】【3052】【WC2013】糖果公园

树分块 老早(大约一个月以前?)就听说这道神题了……orz rausen 一直拖到现在才做……发现还是不会呢= = 只好也去Orz了Hzwer和zky http://hzwer.com/5250.html http://blog.csdn.net/iamzky/article/details/42125999 这个树上莫队真的蛮神奇的…… 1.对于每个查询,记录它是在第几次修改之后的; 2.以左端点所在块为第一关键字.右端点所在块为第二关键字.时间(第几次修改之后的查询)为第三关键字进行排序;

uoj #58【WC2013】糖果公园

http://uoj.ac/problem/58 树上带修莫队模板题 #include<bits/stdc++.h> const int N=100007; typedef long long i64; char buf[N*100],*ptr=buf-1,ob[N*25],*op=ob; int _(){ int x=0; while(*ptr<48)++ptr; while(*ptr>47)x=x*10+*ptr++-48; return x; } void pr(i64 x)

【WC2013】糖果公园

UOJ 题解:树上莫队转移. 一开始UV打错,WA了一发. 1 #include<cmath> 2 #include<cstdio> 3 #include<iostream> 4 #include<vector> 5 #include<algorithm> 6 #define pb push_back 7 using namespace std; 8 inline char nc() { 9 static char b[1<<14],

BZOJ3052 &amp; UOJ58:【WC2013】糖果公园——题解

http://uoj.ac/problem/58 http://www.lydsy.com/JudgeOnline/problem.php?id=3052 输入格式 输出格式 input 4 3 5 1 9 2 7 6 5 1 2 3 3 1 3 4 1 2 3 2 1 1 2 1 4 2 0 2 1 1 1 2 1 4 2 output 84 131 27 84 —————————————————————————————————————— 这题对于一个刚学莫队的人来说……挺萌的. 首先先对树分

【BZOJ】3052: [wc2013]糖果公园 树分块+待修改莫队算法

[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的和或修改一个点的糖果ci.n,m,q<=10^5. [算法]树分块+带修改莫队算法 [题解]参考:WC 2013 糖果公园 park 题解 by vfleaking 首先树分块,参考王室联邦的方法.确定块大小为B,一遍DFS可以分成若干大小为[B,3B]的块,性质是块内两点距离至多为B. 定义(x,

WC2013 糖果公园

COGS 1817. [WC2013]糖果公园 http://www.cogs.pro/cogs/problem/problem.php?pid=1817 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩. 糖果公园的结构十分奇特,它由 n 个游览点构成,每个游览点

[bzoj 3052][wc2013]糖果公园

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3052 [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 1213  Solved: 609[Submit][Status][Discuss] Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 树上莫队,把树分块,