Description

Input

Output

Sample Input

4 3 5
1 9 2
7 6 5 1
2 3
3 1
3 4
1 2 3 2
1 1 2
1 4 2
0 2 1
1 1 2
1 4 2

Sample Output

84
131
27
84

HINT

Solution

一个讲解

还是改成括号序的写法吧……感觉好理解还好码……

一开始插入和删除函数是像下面这样分开写的,$vis$函数加加减减不知道哪里错了……如果有大爷看出来哪里错了和我说一声啊QAQ

 void Ins(int x)
{
vis[x]++;
if (vis[x]==) Delicacy-=v[c[x]]*w[Keg[c[x]]], Keg[c[x]]--;
else Keg[c[x]]++, Delicacy+=v[c[x]]*w[Keg[c[x]]];
} void Del(int x)
{
vis[x]--;
if (vis[x]==) Keg[c[x]]++, Delicacy+=v[c[x]]*w[Keg[c[x]]];
else Delicacy-=v[c[x]]*w[Keg[c[x]]], Keg[c[x]]--;
} void Recov(int x,int val)
{
if (vis[x]==) Del(x), c[x]=val, Ins(x);
c[x]=val;
}

后来改成天下第一的写法对$vis$搞异或就过了……至今不知道为什么……

还有我才发现我二轮的树上莫队写的是对的啊……只不过$cmp$函数写错真的太开心了……

虽然多那30分也无济于事就是了……

话说我二轮的树上莫队既然是对的那我2月份写的那一发树分块糖果公园为什么T成狗啊

Code

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N (200009)
#define LL long long
using namespace std; struct Que{int l,r,t,num,flag; LL ans;}Q[N];
struct Mdf{int pre,nxt,pos;}M[N];
struct Edge{int to,next;}edge[N<<];
LL Delicacy,v[N],w[N];
int n,m,q,x,y,opt,l=,r,flag,Q_num,M_num,Time,dfs_num;
int Keg[N*],vis[N],ID[N],a[N];
int Fir[N],Sec[N],f[N][],Depth[N],c[N];
int head[N],num_edge;
bool cmp1(Que a,Que b)
{
if (ID[a.l]==ID[b.l])
return ID[a.r]==ID[b.r]?a.t<b.t:ID[a.r]<ID[b.r];
else return ID[a.l]<ID[b.l];
}
bool cmp2(Que a,Que b) {return a.num<b.num;} void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Ins(int x)
{
if (vis[x]) Delicacy-=v[c[x]]*w[Keg[c[x]]], Keg[c[x]]--;
else Keg[c[x]]++, Delicacy+=v[c[x]]*w[Keg[c[x]]];
vis[x]^=;
} void Recov(int x,int val)
{
if (vis[x]) Ins(x),c[x]=val,Ins(x);
else c[x]=val;
} void MoQueue(int num)
{
while (Time<Q[num].t) Recov(M[Time+].pos,M[Time+].nxt), Time++;
while (Time>Q[num].t) Recov(M[Time].pos,M[Time].pre), Time--;
while (l<Q[num].l) Ins(a[l++]);
while (l>Q[num].l) Ins(a[--l]);
while (r<Q[num].r) Ins(a[++r]);
while (r>Q[num].r) Ins(a[r--]);
Q[num].ans=Delicacy;
if (Q[num].flag)
{
Ins(Q[num].flag);
Q[num].ans=Delicacy;
Ins(Q[num].flag);
}
} void DFS(int x,int fa)
{
f[x][]=fa;
for (int i=; i<=; ++i) f[x][i]=f[f[x][i-]][i-];
Depth[x]=Depth[fa]+; Fir[x]=++dfs_num;
a[dfs_num]=x;
for (int i=head[x]; i; i=edge[i].next)
if (edge[i].to!=fa) DFS(edge[i].to,x);
Sec[x]=++dfs_num; a[dfs_num]=x;
} int LCA(int x,int y)
{
if (Depth[x]<Depth[y]) swap(x,y);
for (int i=; i>=; --i)
if (Depth[f[x][i]]>=Depth[y]) x=f[x][i];
if (x==y) return x;
for (int i=; i>=; --i)
if (f[x][i]!=f[y][i]) x=f[x][i], y=f[y][i];
return f[x][];
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
int unit=pow(n,2.0/3.0);
for (int i=; i<=(n*); ++i) ID[i]=(i-)/unit+;
for (int i=; i<=m; ++i) scanf("%lld",&v[i]);
for (int i=; i<=n; ++i) scanf("%lld",&w[i]);
for (int i=; i<=n-; ++i)
scanf("%d%d",&x,&y), add(x,y), add(y,x);
for (int i=; i<=n; ++i) scanf("%d",&c[i]);
DFS(,);
for (int i=; i<=q; ++i)
{
scanf("%d%d%d",&opt,&x,&y);
if (opt==)
{
if (Fir[x]>Fir[y]) swap(x,y);
int lca=LCA(x,y);
if (lca==x) x=Fir[x], y=Fir[y], flag=;
else x=Sec[x], y=Fir[y], flag=lca;
Q[++Q_num]=(Que){x,y,M_num,i,flag,};
}
else M[++M_num]=(Mdf){c[x],y,x}, c[x]=y;
}
for (int i=M_num; i>=; --i)
c[M[i].pos]=M[i].pre;
sort(Q+,Q+Q_num+,cmp1);
for (int i=; i<=Q_num; ++i)
MoQueue(i);
sort(Q+,Q+Q_num+,cmp2);
for (int i=; i<=Q_num; ++i)
printf("%lld\n",Q[i].ans);
}

BZOJ3052:[WC2013]糖果公园(树上莫队)的更多相关文章

  1. P4074 [WC2013]糖果公园 树上莫队带修改

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

  2. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  3. BZOJ 3052: [wc2013]糖果公园 | 树上莫队

    题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...

  4. 【WC2013】 糖果公园 - 树上莫队

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

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

    题意: 一棵树,修改一个点的颜色,询问两点路径上每种颜色的权值$val[c]$*出现次数的权值$cou[w[c]]$的和 sro VFK 树上莫队 按照王室联邦的方法分块,块的大小直径个数有保证,并不 ...

  6. 洛谷P4074 [WC2013]糖果公园(莫队)

    传送门 总算会树形莫队了…… 上次听说树形莫队是给树分块,实在看不懂.然后用括号序列的方法做总算能弄明白了 先说一下什么是括号序列,就是在$dfs$的时候,进入的时候记录一下,出去的时候也记录一下 拿 ...

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

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

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

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

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

    传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...

随机推荐

  1. 页面刷新 location.reload()

    * 页面不刷新,但是加了location.reload()后,把炒作失败提示语都刷没了.//成功,不提示,刷新看数据变化ajax success:function(res){ if(res.code= ...

  2. CSS之浮动布局(float,浮动原理,清除/闭合浮动方法)

    css之浮动布局 本人博客:查看文章   1.什么是浮动:在我们布局的时用到的一种技术,能够方便我们进行布局,通过让元素浮动,我们可以使元素在水平上左右移动,再通过margin属性调整位置 2.浮动的 ...

  3. ArcGIS Server命令行工具学习笔记

    备份命令 backup.py 参数: -u 管理员账号 -p 密码 -s 站点URL -f 备份文件的存储目录路径 -h 显示帮助 还原命令 restore.py 参数: -u 管理员账号 -p 密码 ...

  4. GADL针对矢量数据格式转换的实用工具 —— ogr2ogr

    最初,因为可爱的学弟请教如何将ESRI Shapefile文件导入Google Earth接触到了Ogr2Ogr.粗略了解之后发现,这小东西功能强大. 谷歌地球支持矢量数据的展示,前提是数据符合KML ...

  5. 【vue】webpack插件svg-sprite-loader---实现自己的icon组件

    引言:最近开始写vue的项目,借鉴了一下vue-element-admin源码,针对vue有一个关于icon图标的处理,最近也找了很多关于vue的icon处理的解决方案,大部分都是按照之前小程序的方式 ...

  6. JSPatch 可以让你用 JavaScript 书写原生 iOS APP

    简介   JSPatch 可以让你用 JavaScript 书写原生 iOS APP.只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本 ...

  7. Flutter: 图解 ListView 的多种绑定方式

       小菜昨天刚学习了一下底部状态栏 BottomNavigationBar 的基本使用方法,今天学习一下 ListView 的基本用法.       小菜觉得 Flutter 中 ListView ...

  8. DNS隧道实战&&cobaltstrike利用dns隧道

    前言 使用 dns 隧道进行 tcp 通信. 正文 首先配置域名 配置一个 A 记录指向我们的 vps, 然后配置几个 ns 记录,指向刚刚设置的 A 记录 然后在服务端安装 wget https:/ ...

  9. 一步一步pwn路由器之uClibc中malloc&&free分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...

  10. 一步一步pwn路由器之radare2使用全解

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...