#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 100001
typedef long long ll;
int v[N<<1],en,first[N],next[N<<1];
void AddEdge(int U,int V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
int n,m,a[N],b[N];
int eq,ec,blo,sz,siz[N],top[N],fa[N],dep[N],num[N];
void dfs(int U)
{
for(int i=first[U];i;i=next[i])
if(v[i]!=fa[U])
{
fa[v[i]]=U;
dep[v[i]]=dep[U]+1;
if(siz[top[U]]<sz)
{
++siz[top[U]];
top[v[i]]=top[U];
}
dfs(v[i]);
}
}
void df2(int U)
{
num[U]=blo;
for(int i=first[U];i;i=next[i])
if(v[i]!=fa[U]&&top[v[i]]==top[U])
df2(v[i]);
}
int lca(int U,int V)
{
while(U!=V)
{
if(top[U]!=top[V])
{
if(dep[top[U]]<dep[top[V]])
swap(U,V);
U=fa[top[U]];
}
else
{
if(dep[U]<dep[V])
swap(U,V);
U=fa[U];
}
}
return U;
}
struct UPT{int x,y,z;}CH[N];
struct ASK{int l,r,p,t;}Q[N];
bool operator < (const ASK &a,const ASK &b)
{
if(num[a.l]==num[b.l])
{
if(num[a.r]==num[b.r])
return a.t<b.t;
return num[a.r]<num[b.r];
}
return num[a.l]<num[b.l];
}
ll anss[N],ans;
int Vs[N],Ws[N],q;
bool vis[N];
int T[N];
void Update(int x,int op)
{
if(op==-1) ans-=(ll)Vs[x]*(ll)Ws[T[x]];
T[x]+=op;
if(op==1) ans+=(ll)Vs[x]*(ll)Ws[T[x]];
}
void Work(int U,int V,int LCA)
{
while(U!=LCA)
{
vis[U]^=1;
Update(a[U],vis[U]?1:-1);
U=fa[U];
}
while(V!=LCA)
{
vis[V]^=1;
Update(a[V],vis[V]?1:-1);
V=fa[V];
}
}
int main()
{
int x,y; bool op;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;++i) scanf("%d",&Vs[i]);
for(int i=1;i<=n;++i) scanf("%d",&Ws[i]);
for(int i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
AddEdge(x,y);
AddEdge(y,x);
}
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
top[i]=i;
siz[i]=1;
}
sz=(int)pow((double)n,2.0/3.0);
dfs(1);
for(int i=1;i<=n;++i)
if(top[i]==i)
{
++blo;
df2(i);
}
en=n;
memcpy(b,a,sizeof(int)*(n+1));
for(int i=1;i<=q;++i)
{
scanf("%d",&op);
if(!op)
{
++ec; ++en;
scanf("%d%d",&CH[ec].x,&CH[ec].y);
CH[ec].z=b[CH[ec].x];
b[CH[ec].x]=CH[ec].y;
}
else
{
++eq;
scanf("%d%d",&Q[eq].l,&Q[eq].r);
Q[eq].t=ec; Q[eq].p=eq;
}
}
sort(Q+1,Q+eq+1);
for(int i=1;i<=Q[1].t;++i)
a[CH[i].x]=CH[i].y;
int LCA=lca(Q[1].l,Q[1].r);
Work(Q[1].l,Q[1].r,LCA);
Update(a[LCA],1);
anss[Q[1].p]=ans;
Update(a[LCA],-1);
for(int i=2;i<=eq;++i)
{
if(Q[i-1].t<Q[i].t) for(int j=Q[i-1].t+1;j<=Q[i].t;++j)
{
if(vis[CH[j].x])
{
Update(CH[j].y,1);
Update(a[CH[j].x],-1);
}
a[CH[j].x]=CH[j].y;
}
else for(int j=Q[i-1].t;j>Q[i].t;--j)
{
if(vis[CH[j].x])
{
Update(CH[j].z,1);
Update(a[CH[j].x],-1);
}
a[CH[j].x]=CH[j].z;
}
Work(Q[i-1].l,Q[i].l,lca(Q[i-1].l,Q[i].l));
Work(Q[i-1].r,Q[i].r,lca(Q[i-1].r,Q[i].r));
LCA=lca(Q[i].l,Q[i].r);
Update(a[LCA],1);
anss[Q[i].p]=ans;
Update(a[LCA],-1);
}
for(int i=1;i<=eq;++i)
printf("%lld\n",anss[i]);
return 0;
}

【树上莫队】【带修莫队】bzoj3052 [wc2013]糖果公园的更多相关文章

  1. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  2. BZOJ3052: [wc2013]糖果公园【树上带修莫队】

    Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...

  3. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  4. BZOJ3052:[WC2013]糖果公园(树上莫队)

    Description Input Output Sample Input 4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2 Sam ...

  5. BZOJ3052 [wc2013] 糖果公园 【树上莫队】

    树上莫队和普通的序列莫队很像,我们把树进行dfs,然后存一个长度为2n的括号序列,就是一个点进去当作左括号,出来当作右括号,然后如果访问从u到v路径,我们可以转化成括号序列的区间,记录x进去的时候编号 ...

  6. bzoj3052: [wc2013]糖果公园

    又是一代神题. uoj测速rank10,bzoj测速rank26(截止当前2016.5.30 12:58) 带修改的树上莫队. 修改很少,块的大小随便定都能A 然而我一开始把开3次根写成了pow(bl ...

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

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

  8. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  9. luogu4074 [WC2013]糖果公园(树上带修莫队)

    link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...

随机推荐

  1. Consumer [分组背包]

    Consumer Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Subm ...

  2. yaml语法

    http://blog.csdn.net/mack415858775/article/details/51015662 name: Tom Smith age: 37 spouse: name: Ja ...

  3. 【BZOJ2648】SJY摆棋子 [KD-tree]

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...

  4. [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树

    Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...

  5. keras_实现cnn_手写数字识别

    # conding:utf-8 import os os.environ[' import numpy as np from keras.models import Sequential from k ...

  6. windows支持applocker的版本

    Operating system requirements   The following table show the on which operating systems AppLocker fe ...

  7. Python selenium.webdriver.chrome.options.Options() Examples

    The following are 27 code examples for showing how to use selenium.webdriver.chrome.options.Options( ...

  8. GIT指令简洁篇

    查看.添加.提交.删除.找回,重置修改文件 git help <command> # 显示command的help git show # 显示某次提交的内容 git show $id gi ...

  9. django配置使用redis

    通常redis都是用来保存session.短信验证码.图片验证码等数据. 在django上使用redis,先要安装一个包: pip install django-redis==4.8.0(我用的dja ...

  10. synchronized 修饰static方法

    •1.依靠对象锁锁定 初始化一个对象时,自动有一个 对象锁. synchronized {普通方法}依靠对象锁工作,多线程访问synchronized方法,一旦某个进程抢得锁之后,其他的进程只有排队对 ...