「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;
}
「WC2013」糖果公园的更多相关文章
- 【BZOJ3052】【UOJ#58】【WC2013】糖果公园(树上莫队)
		[BZOJ3052][UOJ#58][WC2013]糖果公园(树上莫队) 题面 UOJ 洛谷 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引 ... 
- UOJ #58 【WC2013】 糖果公园
		题目链接:糖果公园 听说这是一道树上莫队的入门题,于是我就去写了--顺便复习了一下莫队的各种姿势. 首先,我们要在树上使用莫队,那么就需要像序列一样给树分块.这个分块的过程就是王室联邦这道题(vfle ... 
- UOJ58 【WC2013】糖果公园
		本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ... 
- 【WC2013】糖果公园
		Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩. 糖果公园的结构十分奇特,它由 nn 个游览点构成,每个游览 ... 
- 【WC2013】 糖果公园 - 树上莫队
		问题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩.糖果公园的结构十分奇特,它由 n 个游览点构成, ... 
- 【BZOJ】【3052】【WC2013】糖果公园
		树分块 老早(大约一个月以前?)就听说这道神题了……orz rausen 一直拖到现在才做……发现还是不会呢= = 只好也去Orz了Hzwer和zky http://hzwer.com/5250.ht ... 
- 「SCOI2011」糖果
		蒟蒻又回来写题解了... 题面 幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红 ... 
- uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)
		[题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ... 
- uoj #58 【WC2013】糖果公园
		题面:http://uoj.ac/problem/58 正解:树上带修改莫队. 首先Orz vfk大神,树上莫队的套路还是很厉害的..http://vfleaking.blog.163.com/blo ... 
随机推荐
- 接口自动化框架(Pytest,Allure,Yaml)
			框架链接:https://www.jianshu.com/p/e31c54bf15ee 目前是基于他的框架做了些改动(主要是session.action()和json格式传参). 后续优化,应该主要思 ... 
- Java连载77-Integer常用方法、Integer、int、String三者相互转化、自动装箱、自动拆箱
			一.关于Integer中常用的方法 package com.bjpowernode.java_learning;  public class D77_1_ { public static void ... 
- unity命令行参数
			Typically, Unity will be launched by double-clicking its icon from the desktop but it is also possib ... 
- flume--exec源
			创建a2.conf文件并且编写 Sources 类型是exec 配置文件如下 启动集群 启动flume 产生临时文件 ...tmp 关闭临时文件 再次写入文本,会再次产生一个临时文件.截图左边是一个内 ... 
- java项目中的异常处理总结
			异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误.出现错误时观察错误的名字和行号最为重要. 比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常. 我找一个比较形象 ... 
- 2.17NOIP模拟赛(by hzwer) T1 小奇挖矿
			[题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ... 
- wget 显示网页内容到控制台
			wget -q -O - http://www.microsoft.com 
- Codeforces Round #620 (Div. 2)D(LIS,构造)
			#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ]; ]; int main(){ io ... 
- windows 安装 MySQL
			windows 安装 MySQL MySQL 目录结构 成功完成 MySQL 数据库的安装和配置! 
- 2019 ICPC南京网络赛 F题 Greedy Sequence(贪心+递推)
			计蒜客题目链接:https://nanti.jisuanke.com/t/41303 题目:给你一个序列a,你可以从其中选取元素,构建n个串,每个串的长度为n,构造的si串要满足以下条件, 1. si ... 
