浅谈莫队: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. UNIX 系统常用管理命令

    一. 引言 UNIX系统作为一种强大的多用户分时操作系统,在越来越多的场合受到了应用,同时,对UNIX的系统管理的要求也随之越来越多,但目前的书籍对UNIX系统管理命令介绍的并不是很多.本文主要是针对 ...

  2. 【HackerRank】 有洞的地图

    给你一个n*n的地图.地图中的每个格子有一个值表示该地区的深度.我们称一个地图中的一个格子为空洞,当且仅当该格子不在地图边缘并且每个和它相邻的格子都具有比它更小的深度.两个格子称为相邻如果它们共有一条 ...

  3. 20145230《JAVA程序设计》第2周学习总结

    20145230 <Java程序设计>第2周学习总结 教材学习内容总结 本周我学习了<JAVA学习笔记>中的第三章内容,让我对JAVA有了进一步的了解.第三章主要是介绍JAVA ...

  4. 谈谈 cci 与 i2c

    cci的名字叫, camera control interface, 他由两部分组成,一是i2c ,而另一个部分是 gpio.也就是说,cci 包含i2c.一般情况下,我们只是用到了i2c 部分,没有 ...

  5. Centos6.5使用yum安装软件的时候 Another app is currently holding the yum lock; waiting for it to exit...

    Loaded plugins: fastestmirror, refresh-packagekit, security Existing . Another app is currently hold ...

  6. springboot 配置过滤器

    能配置例外 先写配置文件类 FilterConfig.java package com.ty.tyzxtj.config; import javax.servlet.Filter; import or ...

  7. 导出android真机上应用的apk文件

    1. 首先你的手机要开启调试模式 2. 终端输入命令行 (这个时候需要在手机端打开此应用.它的思路是抓取出当前窗口的包名.以下命令操作自己未亲自验证.) adb shell dumpsys windo ...

  8. 【FINAL】NOI

    我就是复习一下..根本就不是什么题解...谁也看不懂的... NOI2007 社交网络         最短路 货币兑换         斜率优化动态规划 项链工厂         线段树 生成树计数 ...

  9. vc 判断当前用户是否在管理员组以及是否SYSTEM权限运行

    BOOL IsUserInAdminGroup() //判断是否在管理员组 { BOOL fInAdminGroup = FALSE; HANDLE hToken = NULL; HANDLE hTo ...

  10. Python创建插入数据库MySQL

    首先要在控制台创建好数据库 mysql -u root -p 创建数据库 查看数据库 -------------------更新分割线(上面为新增...太久没用都忘了SQL基本命令了)-------- ...