原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html

题目传送门 - BZOJ3052

题目传送门 - UOJ#58

题意

  给定一棵树,有 $n$ 个节点。有 $m$ 种颜色,第 $i$ 个节点的颜色为 $c_i$ 。

  给定参数 $v_{1},v_2,\cdots,v_m$ 和 $w_1,w_2,\cdots ,w_n$ ,具有以下意义:

    第 $i$ 次遇到颜色为 $j$ 的节点,新得到的收益为 $v_{j}\times w_i$ 。

  现在有 $q$ 次操作,操作有以下两种类型:

  1. 给定 $x,y$ ,询问一个人从节点 $x$ 走到节点 $y$ 得到的总收益。

  2. 给定 $x,y$ ,把节点 $x$ 的颜色改成 $y$ 。

  请你对于每一个询问输出结果。

  $1\leq n,m,q\leq 10^5,1\leq v_i,w_i\leq 10^6\ \ \ \ \ \ \ \rm{Time\ limit = 8s} $

题解

  树上带修莫队模板题。

  把树上询问转化成括号序列,变成区间问题。然后上带修莫队。

  注意询问的时候的特殊情况,例如 $x$ 和 $y$ 存在子孙或祖先关系时,括号序列区间的取值有所不同。

  时间复杂度 $O(n^\frac{5}{3})$ 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int read(){
char ch=getchar();
int x=0;
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x;
}
const int N=100005;
struct Gragh{
static const int M=N*2;
int cnt,y[M],nxt[M],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
struct Query{
int L,R,id,LCA;
LL ans;
Query(){}
Query(int _L,int _R,int _id,int _LCA){
L=_L,R=_R,id=_id,LCA=_LCA;
}
}Q[N];
struct Operation{
int x,v1,v2,id;
Operation(){}
Operation(int _x,int _v1,int _v2,int _id){
x=_x,v1=_v1,v2=_v2,id=_id;
}
}O[N];
int n,m,q,Qcnt,Ocnt;
int depth[N],fa[N][20],in[N],out[N],id[N<<1],bID[N<<1],Time;
int v[N],w[N],c[N],dc[N];
int tax[N],opt[N];
void dfs(int x,int pre,int d){
fa[x][0]=pre,depth[x]=d,id[in[x]=++Time]=x;
for (int i=1;i<17;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for (int i=g.fst[x];i;i=g.nxt[i])
if (g.y[i]!=pre)
dfs(g.y[i],x,d+1);
id[out[x]=++Time]=x;
}
int LCA(int x,int y){
if (depth[x]<depth[y])
swap(x,y);
for (int i=16;i>=0;i--)
if (depth[x]-(1<<i)>=depth[y])
x=fa[x][i];
if (x==y)
return x;
for (int i=16;i>=0;i--)
if (fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
bool cmp(Query a,Query b){
if (bID[a.L]!=bID[b.L])
return bID[a.L]<bID[b.L];
if (bID[a.R]!=bID[b.R])
return bID[a.R]<bID[b.R];
return a.id<b.id;
}
bool cmpid(Query a,Query b){
return a.id<b.id;
}
LL ans=0;
void update(int i){
int x=id[i];
if (!opt[x])
ans+=1LL*v[c[x]]*w[++tax[c[x]]];
else
ans-=1LL*v[c[x]]*w[tax[c[x]]--];
opt[x]^=1;
}
void update_Time(int i){
int x=O[i].x,a=O[i].v1,b=O[i].v2;
if (c[x]!=a)
swap(a,b);
if (opt[x])
ans-=1LL*v[c[x]]*w[tax[c[x]]--];
c[x]=b;
if (opt[x])
ans+=1LL*v[c[x]]*w[++tax[c[x]]];
}
void solve(){
sort(Q+1,Q+Qcnt+1,cmp);
O[0].id=0,O[Ocnt+1].id=q+1;
memset(tax,0,sizeof tax);
memset(opt,0,sizeof opt);
int L=1,R=0,t=0;
for (int i=1;i<=Qcnt;i++){
while (L<Q[i].L)
update(L++);
while (L>Q[i].L)
update(--L);
while (R<Q[i].R)
update(++R);
while (R>Q[i].R)
update(R--);
while (O[t+1].id<Q[i].id)
update_Time(++t);
while (O[t].id>Q[i].id)
update_Time(t--);
Q[i].ans=ans+1LL*v[c[Q[i].LCA]]*w[tax[c[Q[i].LCA]]+1];
}
sort(Q+1,Q+Qcnt+1,cmpid);
}
int main(){
n=read(),m=read(),q=read();
for (int i=1;i<=m;i++)
v[i]=read();
for (int i=1;i<=n;i++)
w[i]=read();
g.clear();
for (int i=1,a,b;i<n;i++){
a=read(),b=read();
g.add(a,b);
g.add(b,a);
}
for (int i=1;i<=n;i++)
dc[i]=c[i]=read();
Time=0;
dfs(1,0,0);
for (int i=1;i<=n*2;i++)
bID[i]=(i-1)/pow(n,0.666);
Qcnt=Ocnt=0;
for (int i=1;i<=q;i++){
int opt=read(),x=read(),y=read();
if (!opt){
O[++Ocnt]=Operation(x,dc[x],y,i);
dc[x]=y;
}
else {
if (in[x]>in[y])
swap(x,y);
int lca=LCA(x,y);
if (x==lca)
Q[++Qcnt]=Query(in[x],in[y],i,0);
else
Q[++Qcnt]=Query(out[x],in[y],i,lca);
}
}
solve();
for (int i=1;i<=Qcnt;i++)
printf("%lld\n",Q[i].ans);
return 0;
}

  

BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队的更多相关文章

  1. [BZOJ3052][UOJ#58][WC2013]糖果公园

    [BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...

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

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  3. BZOJ3052 & UOJ58:[WC2013]糖果公园——题解

    http://uoj.ac/problem/58 http://www.lydsy.com/JudgeOnline/problem.php?id=3052 输入格式 输出格式 input 4 3 5 ...

  4. 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队

    [BZOJ3052][wc2013]糖果公园 Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 ...

  5. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...

  6. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)

    题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...

  7. 洛谷 P4074 [WC2013]糖果公园 解题报告

    P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...

  8. AC日记——[WC2013]糖果公园 cogs 1817

    [WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...

  9. COGS1817. [WC2013]糖果公园

    1817. [WC2013]糖果公园 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland ...

随机推荐

  1. HTTP协议详解(一)

    1 http协议介绍 1.1 简单介绍  HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consort ...

  2. 前端 ----jQuery的文件操作

    06-jQuery的文档操作***   之前js中咱们学习了js的DOM操作,也就是所谓的增删改查DOM操作.通过js的DOM的操作,大家也能发现,大量的繁琐代码实现我们想要的效果.那么jQuery的 ...

  3. hive学习04-员工部门表综合案例

    知识点: 格式转换:cast(xxx as int) 按某列分桶某列排序,排序后打标机:例如:求每个地区工资最高的那个人的信息: ROW_NUMBER() OVER(PARTITION BY COLU ...

  4. FormData中delete方法在ios不兼容

    1.移动端直接用的input的file上传图片(name=“file”必填) <input type="file" id="exampleInputFile1&qu ...

  5. Swift 学习- 06 -- 控制流

    // 控制流 // swift 提供了多种控制流结构,包括可以多次执行的 while 循环,基于特定条件选择执行不同分支的 if, guard 和 switch 语句,还有控制流程跳转到其它代码位置的 ...

  6. <<人月神话>>阅读体会(一)

    第一次听说人月神话还是在大一上学期的导论课那会儿,那会儿好像就已经确定了自己要学软件,于是就去问王建民老师能不能给我推荐几本软件工程方面的书,我想要提前自己学学,以为老师会给我推荐一些某种语言类的学习 ...

  7. Linux用户、用户组、文件权限学习笔记

    最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识.学习这几样东西,得先掌握linux的权限系统相关知识.linux的权限系统主要是由用户.用户组和权限 ...

  8. 第七篇 python基础之函数,递归,内置函数

    一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...

  9. Python基础之模块与包

    一.模块 1.什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函 ...

  10. AI-响应式、分页器

    响应式 如果在setting配置下列,当只有BrowsableAPIRenderer时,只会返回浏览器页面:当配置成JSONRenderer,会返回json数据 REST_FRAMEWORK={ 'D ...