bzoj3052: [wc2013]糖果公园
又是一代神题。
uoj测速rank10,bzoj测速rank26(截止当前2016.5.30 12:58)
带修改的树上莫队。
修改很少,块的大小随便定都能A
然而我一开始把开3次根写成了pow(blabla,1/3)
我一副见了鬼的样子.jpg
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 200005
#define M 200005 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return ret;
} struct edge{
int adj,next;
edge(){}
edge(int _adj,int _next):adj(_adj),next(_next){}
} e[M];
int n,g[N],m;
void AddEdge(int u,int v){
e[++m]=edge(v,g[u]);g[u]=m;
e[++m]=edge(u,g[v]);g[v]=m;
}
int fa[N],deep[N],dfn[N],stamp;
void dfs(int u){
dfn[u]=++stamp;
deep[u]=deep[fa[u]]+1;
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
if (v==fa[u]) continue;
fa[v]=u;
dfs(v);
}
++stamp;
}
int anc[N][19];
void precompute(){
fa[1]=fa[0]=deep[0]=0;stamp=0;
dfs(1);
memset(anc[0],0,sizeof(anc[0]));
for (int i=1;i<=n;++i) anc[i][0]=fa[i];
for (int k=1;k<17;++k)
for (int i=1;i<=n;++i)
anc[i][k]=anc[anc[i][k-1]][k-1];
}
int qlca(int u,int v){
if (deep[u]<deep[v]) swap(u,v);
for (int k=16;k>=0;--k) if (deep[anc[u][k]]>=deep[v]) u=anc[u][k];
for (int k=16;k>=0;--k) if (anc[u][k]!=anc[v][k]) u=anc[u][k],v=anc[v][k];
return u==v?u:fa[u];
} struct Query{
int u,v,tm,id;
} q[N];
int bl[N];
inline bool operator <(const Query &x,const Query &y){
if (bl[dfn[x.u]]!=bl[dfn[y.u]]) return bl[dfn[x.u]]<bl[dfn[y.u]];
else if (bl[dfn[x.v]]!=bl[dfn[y.v]]) return bl[dfn[x.v]]<bl[dfn[y.v]];
else return ((x.tm<y.tm)^(bl[dfn[x.v]]&1));
}
int Q; int cdy,c[N],val[N],kk[N];
int cnt[N];
bool exist[N];
ll nowans;
void change(int u){
if (exist[u]) nowans-=(ll)val[c[u]]*kk[cnt[c[u]]--];
else nowans+=(ll)val[c[u]]*kk[++cnt[c[u]]];
exist[u]^=1;
}
void moveTo(int u,int v){
int w=qlca(u,v);
for (;u!=w;u=fa[u]) change(u);
for (;v!=w;v=fa[v]) change(v);
}
void modify(int u,int to){
if (exist[u]) nowans-=(ll)val[c[u]]*kk[cnt[c[u]]--];
c[u]=to;
if (exist[u]) nowans+=(ll)val[c[u]]*kk[++cnt[c[u]]];
} int mdf,pt[N],fr[N],to[N];
int tmpc[N];
ll ans[N];
int main(){
// freopen("candyland.in","r",stdin);
// freopen("candyland.out","w",stdout);
n=read();cdy=read();Q=read();
for (int i=1;i<=cdy;++i) val[i]=read();
for (int i=1;i<=n;++i) kk[i]=read();
memset(g,0,sizeof(g));m=1;
for (int i=1;i<n;++i) AddEdge(read(),read());
for (int i=1;i<=n;++i) tmpc[i]=c[i]=read();
precompute();
mdf=0;
for (int i=1;i<=Q;++i)if (read()){
q[i].u=read();q[i].v=read();
if (dfn[q[i].u]>dfn[q[i].v]) swap(q[i].u,q[i].v);
q[i].tm=mdf;
q[i].id=i;
}
else{
--Q;--i;++mdf;
pt[mdf]=read();
fr[mdf]=c[pt[mdf]];
to[mdf]=c[pt[mdf]]=read();
}
int K=max(sqrt(n),pow((double)4*n*n*mdf/Q,1.0/3));
for (int i=1;i<=2*n;++i) bl[i]=i/K;
sort(q+1,q+Q+1);
for (int i=1;i<=n;++i) c[i]=tmpc[i];
memset(cnt,0,sizeof(cnt));
memset(exist,0,sizeof(exist));
q[0].u=q[0].v=1;q[0].tm=0;
nowans=0;
int nowtm=0,w;
for (int i=1;i<=Q;++i){
moveTo(q[i-1].u,q[i].u);
moveTo(q[i-1].v,q[i].v);
change(w=qlca(q[i].u,q[i].v));
for (;nowtm<q[i].tm;++nowtm) modify(pt[nowtm+1],to[nowtm+1]);
for (;nowtm>q[i].tm;--nowtm) modify(pt[nowtm],fr[nowtm]);
ans[q[i].id]=nowans;
change(w);
} for (int i=1;i<=Q;++i) printf("%lld\n",ans[i]);
return 0;
}
bzoj3052: [wc2013]糖果公园的更多相关文章
- 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 ...
- BZOJ3052: [wc2013]糖果公园【树上带修莫队】
Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...
- BZOJ3052 [wc2013] 糖果公园 【树上莫队】
树上莫队和普通的序列莫队很像,我们把树进行dfs,然后存一个长度为2n的括号序列,就是一个点进去当作左括号,出来当作右括号,然后如果访问从u到v路径,我们可以转化成括号序列的区间,记录x进去的时候编号 ...
- 【树上莫队】【带修莫队】bzoj3052 [wc2013]糖果公园
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...
- 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
[BZOJ3052][wc2013]糖果公园 Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 ...
- [BZOJ3052][UOJ#58][WC2013]糖果公园
[BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- bzoj 3052: [wc2013]糖果公园 带修改莫队
3052: [wc2013]糖果公园 Time Limit: 250 Sec Memory Limit: 512 MBSubmit: 506 Solved: 189[Submit][Status] ...
- 洛谷 P4074 [WC2013]糖果公园 解题报告
P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...
随机推荐
- spring aop对service层日志和异常的处理
1.aop是什么 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种 ...
- JAVA的序列化和持久化的区别与联系
持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文 ...
- [deviceone开发]-do_Album的简单示例
一.简介do_Album用来打开手机系统提供的相册,能选择一张或多张图片返回给开发者,通常相册的图片比较大,要经过缩放.有的时候用户也需要把别的地方获取到到图片收藏到系统相册.这个示例简单展示这个组件 ...
- 做linux运维工程师,必须要掌握以下几个工具
linux系统如果是学习可以选用redhat或centos,特别是centos在企业中用得最多,当然还会有其它版本的,但学习者还是以这2个版本学习就行,因为这两个版本都是兄弟,没区别的,有空可以再研究 ...
- css知识点整理
CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一.css引入的方式 1.行内样式:行内式是在标记的style ...
- FineReport实现EXCEL数据导入自由报表
在制作填报报表的时候,对于空白填报表,常常导出为Excel,派发给各部门人员填写后上交.如何能避免手动输入,直接将Excel中的数据导入到填报表中提交入库呢? 这里以一个简单的员工信息填报示例进行介绍 ...
- Linux 学习
远程登录Linux(05) 文本方式远程: putty SecureCRT winSCP SshClient图形方式远程:Xmanager Xming ifconfigps -ef | gr ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛
如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...
- Json对象与Json字符串互转(4种转换方式)
Json字符与Json对象的相互转换方式有很多,接下来将为大家一一介绍下,感兴趣的朋友可以参考下哈,希望可以帮助到你 1>jQuery插件支持的转换方式: 复制代码代码如下: $.parseJS ...