浅谈莫队:https://www.cnblogs.com/AKMer/p/10374756.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3052

把问题搬到欧拉序上来就是裸的带修改莫队了。

每次加减某种颜色直接加减个数系数乘美味度即可。

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

空间复杂度:\(O(n)\)

代码如下:

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=1e5+5; ll ans;bool vis[maxn];
int dep[maxn],f[maxn][18];
int v[maxn],w[maxn],lst[maxn],c[maxn];
int now[maxn],pre[maxn<<1],son[maxn<<1];
int n,m,q,block,tot,cnt1,cnt2,cnt,nowl,nowr,T;
int dfn[maxn<<1],L[maxn],R[maxn],sum[maxn],bel[maxn<<1]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b;
} void dfs(int fa,int u) {
dfn[++cnt]=u,L[u]=cnt;
dep[u]=dep[fa]+1,f[u][0]=fa;
for(int i=1;i<18;i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(v!=fa)dfs(u,v);
dfn[++cnt]=u,R[u]=cnt;
} struct query {
ll res;
int l,r,id,tim; query() {} query(int _l,int _r,int _id,int _tim) {
l=_l,r=_r,id=_id,tim=_tim;
} bool operator<(const query &a)const {
if(bel[l]==bel[a.l]&&bel[r]==bel[a.r])return tim<a.tim;
if(bel[l]==bel[a.l])return bel[l]&1?bel[r]<bel[a.r]:bel[r]>bel[a.r];
return bel[l]<bel[a.l];
}
}Q[maxn]; struct modify {
int node,id,lst; modify() {} modify(int _node,int _id,int _lst) {
node=_node,id=_id,lst=_lst;
}
}C[maxn]; int lca(int u,int v) {
if(dep[u]<dep[v])swap(u,v);
for(int i=17;~i;i--)
if(dep[f[u][i]]>=dep[v])
u=f[u][i];
if(u==v)return u;
for(int i=17;~i;i--)
if(f[u][i]!=f[v][i])
u=f[u][i],v=f[v][i];
return f[u][0];
} bool cmp(query a,query b) {
return a.id<b.id;
} void change(int u,int id) {
if(vis[u]) {
ans+=1ll*w[++sum[id]]*v[id];
ans-=1ll*w[sum[c[u]]--]*v[c[u]];
}
c[u]=id;
} void change(int u) {
if(!vis[u])ans+=1ll*w[++sum[c[u]]]*v[c[u]];
else ans-=1ll*w[sum[c[u]]--]*v[c[u]];
vis[u]^=1;
} int main() {
n=read(),m=read(),q=read();
block=pow(n<<1,2.0/3);
for(int i=1;i<=m;i++)v[i]=read();
for(int i=1;i<=n;i++)w[i]=read();
for(int i=1;i<n;i++) {
int a=read(),b=read();
add(a,b),add(b,a);
}
dfs(0,1);
for(int i=1;i<=n;i++)lst[i]=c[i]=read();
for(int i=1;i<=n<<1;i++)bel[i]=(i-1)/block+1;
for(int i=1;i<=q;i++) {
int opt=read();
if(opt) {
int u=read(),v=read();
if(L[u]>L[v])swap(u,v);
Q[++cnt1]=query(lca(u,v)==u?L[u]:R[u],L[v],i,cnt2);
}
else {
int node=read(),id=read();
C[++cnt2]=modify(node,id,lst[node]);
lst[node]=id;
}
}
sort(Q+1,Q+cnt1+1);
nowl=1,nowr=0,T=0;
for(int i=1;i<=cnt1;i++) {
while(T<Q[i].tim)T++,change(C[T].node,C[T].id);
while(T>Q[i].tim)change(C[T].node,C[T].lst),T--;
while(nowl<Q[i].l)change(dfn[nowl++]);
while(nowl>Q[i].l)change(dfn[--nowl]);
while(nowr<Q[i].r)change(dfn[++nowr]);
while(nowr>Q[i].r)change(dfn[nowr--]);
if(L[dfn[Q[i].l]]==Q[i].l)Q[i].res=ans;
else {
int tmp=lca(dfn[Q[i].l],dfn[Q[i].r]);
change(tmp);Q[i].res=ans;change(tmp);
}
}
sort(Q+1,Q+cnt1+1,cmp);
for(int i=1;i<=cnt1;i++)
printf("%lld\n",Q[i].res);
return 0;
}

BZOJ3052:[WC2013]糖果公园的更多相关文章

  1. 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 ...

  2. bzoj3052: [wc2013]糖果公园

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

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

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

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

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

  5. 【树上莫队】【带修莫队】bzoj3052 [wc2013]糖果公园

    #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 在Linux终端中查看公有IP的方法详解

    首先回顾一下一般的查看IP的命令: ifconfigLinux查看IP地址的命令--ifconfigifconfig命令用于查看和更改网络接口的地址和参数 $ifconfig -a  lo0: fla ...

  2. Jquery 获取地址位置

    直接在浏览器地址 输入: http://pv.sohu.com/cityjson?ie=utf-8 可以查看数据格式 引入一个搜狐的js库: <script src="http://p ...

  3. JAVA基础补漏--字符串

    字符串常量池 String a="abc"; String b="abc"; char[] str = {"a","b" ...

  4. RealThinClient SDK 学习笔记(1)

    从客户端调用远程函数的两种方法 1: RtcClientModule1.Prepare('select'); // call the "select" function on th ...

  5. JMeter接口测试报错,反馈和postman不一样(二)

    我总共现在有两个可以学习的接口,昨天测试一个接口发现问题解决后,今天测试另外一个发现又有问题了 这一次还是反馈显示不一样 要么 这种情况是直接从postman里面拿过来的数据,没做处理  报not j ...

  6. html5学习笔记(audio)

    来源于<HTML5高级程序设计> audio api <audio controls> controls告诉浏览器显示播放控件 不指定 type 浏览器自解 oggMP3 ty ...

  7. print webpage

    使用浏览器打印网页时(A4纸)有一个固定的尺寸: 高级浏览器: width:700px height:1000px

  8. 英语发音规则---U字母-[复习中]

    英语发音规则---U字母 一.总结 一句话总结:(注:本文所有//的音标为英音音标,[]的音标为美音音标) 1.U在开音节中发[ju ]/ ju: /? duty /'djuːtɪ/ ['dʊti] ...

  9. mouseenter和hover的区别

    js中鼠标事件中,mouseenter和hover都可以达到,鼠标悬浮在目标上,触发事件,那么两者效果相同,有什么区别呢. 经过自己亲自试验.发现,mouseenter和hover还是有区别的. ho ...

  10. nodeJs爬虫小程序练习

    //爬虫小程序 var express = require('express'); //superagent是一个http的库,可以发起get和post请求 var superagent = requ ...