题面:http://uoj.ac/problem/58

正解:树上带修改莫队。

首先Orz vfk大神,树上莫队的套路还是很厉害的。。http://vfleaking.blog.163.com/blog/static/174807634201311011201627/

我们考虑普通的树上莫队。我们要先把树分好块,分块的方式和王室联邦是一样的,即限定块的大小来分块。当我们限定了块的大小以后,我们能保证块的直径不超过块的大小,于是在同一个块内移动是可以保证复杂度的。然后树上莫队每次就是上一个询问的$u$到这一个询问的$u$的路径修改一遍,$v$也是一样,注意每次询问$LCA$都是要特判的。加入修改操作以后,我们考虑普通莫队算法,就是把块的大小改成$O(n^{\frac{2}{3}})$,然后能够保证总复杂度是$O(n^{\frac{5}{3}})$的,每次询问记录它之前要执行的修改次数。然后我们就可以直接暴力搞了,如果修改多了就撤回,少了就加上。这样我们就能完美地解决这道题了。

 //It is made my wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define inf (1<<30)
#define N (100010)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct node1{ int u,v,t,i; }q1[N];
struct node2{ int x,v,pre; }q2[N];
struct edge{ int nt,to; }g[*N]; int head[N],v[N],w[N],top[N],fa[N],son[N],bl[N],sz[N],dep[N],dfn[N],pre[N],col[N],c[N],st[N],vis[N],n,m,Q,tp,Lca,num,cnt,ccnt,cnt1,cnt2,block;
ll ans[N],Ans; il int gi(){
RG int x=,q=; RG char ch=getchar();
while((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void insert(RG int from,RG int to){ g[++num]=(edge){head[from],to},head[from]=num; return; } int cmpt(const node1 &a,const node1 &b){
if (bl[a.u]==bl[b.u] && bl[a.v]==bl[b.v]) return a.t<b.t;
if (bl[a.u]==bl[b.u]) return bl[a.v]<bl[b.v]; return bl[a.u]<bl[b.u];
} il void dfs1(RG int x,RG int p){
fa[x]=p,sz[x]=,dep[x]=dep[p]+; RG int v;
for (RG int i=head[x];i;i=g[i].nt){
v=g[i].to; if (v==p) continue;
dfs1(v,x); sz[x]+=sz[v];
if (sz[son[x]]<=sz[v]) son[x]=v;
}
return;
} il void dfs2(RG int x,RG int p,RG int anc){
top[x]=anc,dfn[x]=++cnt; RG int ttp=tp;
if (son[x]) dfs2(son[x],x,anc); RG int v;
if (tp-ttp>=block){ ccnt++; while (tp>ttp) bl[st[tp--]]=ccnt; } //按大小分块
for (RG int i=head[x];i;i=g[i].nt){
v=g[i].to; if (v==p || v==son[x]) continue; dfs2(v,x,v);
if (tp-ttp>=block){ ccnt++; while (tp>ttp) bl[st[tp--]]=ccnt; }
}
st[++tp]=x; return;
} il int lca(RG int u,RG int v){
while (top[u]!=top[v]){
if (dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v] ? u : v;
} il void update(RG int x){
if (!vis[x]) vis[x]=,c[col[x]]++,Ans+=(ll)w[c[col[x]]]*(ll)v[col[x]];
else vis[x]=,Ans-=(ll)w[c[col[x]]]*(ll)v[col[x]],c[col[x]]--; return;
} il void modify(RG int x,RG int v){ if (!vis[x]) col[x]=v; else update(x),col[x]=v,update(x); return; } il void change(RG int x,RG int y){
while (x!=y){
if (dep[x]<dep[y]) update(y),y=fa[y];
else update(x),x=fa[x];
}
return;
} il void work(){
n=gi(),m=gi(),Q=gi(),block=pow(n,0.6); RG int type,x,y;
for (RG int i=;i<=m;++i) v[i]=gi();
for (RG int i=;i<=n;++i) w[i]=gi();
for (RG int i=;i<n;++i) x=gi(),y=gi(),insert(x,y),insert(y,x);
while (tp) st[tp--]=ccnt;
for (RG int i=;i<=n;++i) col[i]=gi(),pre[i]=col[i]; dfs1(,),dfs2(,,);
for (RG int i=;i<=Q;++i){
type=gi(),x=gi(),y=gi();
if (type){
if (dfn[x]>dfn[y]) swap(x,y);
q1[++cnt1].u=x,q1[cnt1].v=y,q1[cnt1].t=cnt2,q1[cnt1].i=cnt1;
}
if (!type) q2[++cnt2].x=x,q2[cnt2].v=y,q2[cnt2].pre=pre[x],pre[x]=y;
}
sort(q1+,q1+cnt1+,cmpt); cnt2=q1[].t;
for (RG int i=;i<=cnt2;++i) modify(q2[i].x,q2[i].v);
change(q1[].u,q1[].v),Lca=lca(q1[].u,q1[].v);
update(Lca),ans[q1[].i]=Ans,update(Lca); //LCA特判
for (RG int i=;i<=cnt1;++i){
while (cnt2<q1[i].t) cnt2++,modify(q2[cnt2].x,q2[cnt2].v);
while (cnt2>q1[i].t) modify(q2[cnt2].x,q2[cnt2].pre),cnt2--;
change(q1[i-].u,q1[i].u),change(q1[i-].v,q1[i].v);
Lca=lca(q1[i].u,q1[i].v),update(Lca),ans[q1[i].i]=Ans,update(Lca);
}
for (RG int i=;i<=cnt1;++i) printf("%I64d\n",ans[i]); return; //这几天用windows。。
} int main(){
File("park");
work();
return ;
}

uoj #58 【WC2013】糖果公园的更多相关文章

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

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

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

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

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

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

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

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

  5. AC日记——[WC2013]糖果公园 cogs 1817

    [WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...

  6. COGS1817. [WC2013]糖果公园

    1817. [WC2013]糖果公园 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland ...

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

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

  8. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

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

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

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

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

随机推荐

  1. 在python&numpy中切片(slice)

     在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...

  2. Android学习探索之本地原生渲染 LaTeX数据公式

    前言: 一直致力于为公司寻找更加高效的解决方案,作为一款K12在线教育App,功能中难免会有LaTeX数学公式的显示需求,这部分公司已经实现了此功能,只是个人觉得在体验和效率上还是不太好,今天来聊一下 ...

  3. FastCGI超过活动超时时间

    线上环境:PHP5.4 and IIS 打开IIS管理器,找到FastCGI,打开后编辑选项 活动超时默认为70(秒) 请求超时默认为90(秒) 可根据项目需求来更改这两项的值

  4. web注册功能实现

    开发工具:Eclipse Web前端语言:html+jsp 后端数据库:MySQL 数据库UI工具:Navicat for MySQL (根据网上各位前辈的信息,自学实现这个注册基本功能,以后要是学到 ...

  5. 对于用div+css随心所欲布局的思考

    在div+css取代Table成为主流的时代,学会用其进行随心所欲的布局是一个不可回避的技能.那么,重点掌握哪几个要点呢? 整体布局:从整体到局部的顺序进行布局,逐步定义div集css样式: 灵活运用 ...

  6. 让CEF支持FLASH(非安装插件的形式)

    测试环境: CEF3 + CefGlue 下载FLASH的NPAPI DLL文件 , 在CEF目录下新建文件夹plugins,然后把DLL文件放进去即可. 据说下面是PPAPI的方式,未测试 启动的时 ...

  7. JQuery和原生JS跨域加载JSON数据或HTML。

    前提:有时候需要在网页上,加载另一个网站上的数据.或者加载另一个网站上的一个页面.Js的Ajax请求不具备跨域功能,可以使用JQuery来实现. 网页端JS代码: $(function () { $. ...

  8. 谈谈在DevOps实践中,感觉最重要的这三个技术……

    从国内众多DevOps实践中,我们能看到下面三个技术尤其重要和火热: 容器:容器从根本上解决了软件对环境的依懒性,解决了各个环境之间的差异问题:它可以加速部署的速度,提高部署的效率:降低部署的成本.容 ...

  9. 关于JDEV的连接问题

    在JDev中有两个连接数据哭库的地方,双击项目名称,里面的Business Components里面的Connection里面的链接,这个链接是Run页面时候的链接 第二个链接在Oracle Appl ...

  10. SQL Server 备份所有数据库代码

    今天让我备份一下网上所有数据库,猛地一看,几百个呢, 坑爹呢,只好网上找找有没有简便的,没想到还真有 记下来,以后好用,哈哈... use master declare @DbName varchar ...