bzoj 3052: [wc2013]糖果公园【树上带修改莫队】
参考:http://blog.csdn.net/lych_cys/article/details/50845832
把树变成dfs括号序的形式,注意这个是不包含lca的(除非lca是两点中的一个)
然后把询问按照所属块一序,r二序,t三序排序(注意a和b数组的同名变量意思不一样),对于每个询问处理修改,时间正流或者逆流,修改答案时用vis数组记录这个位置是否在答案中被统计过来决定加减。对于修改序列的操作,如果他没有被统计在答案里就直接修改,否则修改答案。对lca特殊处理
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=200005;
int n,m,q,u[N],v[N],w[N],h[N],cnt,c[N],la[N],kuai,f[N],g[N],dfn,bl[N],cnta,cntb;
int de[N],fa[N],fr[N],si[N],hs[N],rl[N];
long long ans[N],sum;
bool vis[N];
struct qw
{
int ne,to;
}e[N<<1];
struct qwe
{
int l,r,t,rl;
}a[N],b[N];//对于b,l是位置,r是修改为的颜色,t是上一个颜色
bool cmp(qwe x,qwe y)
{
return bl[x.l]<bl[y.l]||bl[x.l]==bl[y.l]&&bl[x.r]<bl[y.r]||bl[x.l]==bl[y.l]&&bl[x.r]==bl[y.r]&&x.t<y.t;
}
int read()
{
int r=0;
char p=getchar();
while(p>'9'||p<'0')
p=getchar();
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r;
}
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void dfs1(int u,int fat)
{
fa[u]=fat;
de[u]=de[fat]+1;
si[u]=1;
f[u]=++dfn;
rl[dfn]=u;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fat)
{
dfs1(e[i].to,u);
si[u]+=si[e[i].to];
if(si[e[i].to]>si[hs[u]])
hs[u]=e[i].to;
}
g[u]=++dfn;
rl[dfn]=u;
}
void dfs2(int u,int top)
{
fr[u]=top;
if(!hs[u])
return;
dfs2(hs[u],top);
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa[u]&&e[i].to!=hs[u])
dfs2(e[i].to,e[i].to);
}
int lca(int u,int v)
{
for(;fr[u]!=fr[v];de[fr[u]]>de[fr[v]]?u=fa[fr[u]]:v=fa[fr[v]]);
return de[u]>de[v]?v:u;
}
void add(int x)
{
if(vis[x])
sum-=(long long)v[c[x]]*w[u[c[x]]--];
else
sum+=(long long)v[c[x]]*w[++u[c[x]]];
vis[x]^=1;
}
void change(int x,int y)
{
if(vis[x])
{
add(x);
c[x]=y;
add(x);
}
else
c[x]=y;
}
int main()
{
n=read(),m=read(),q=read();
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 x=read(),y=read();
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++)
c[i]=la[i]=read();
kuai=(int)pow(n,2.0/3);
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=dfn;i++)
bl[i]=(i-1)/kuai;
while(q--)
{
int t=read(),l=read(),r=read();
if(t==0)
{
b[++cntb].l=l;
b[cntb].t=la[l];
la[l]=b[cntb].r=r;
}
else
{
if(f[l]>f[r])
swap(l,r);
a[++cnta].r=f[r];
a[cnta].rl=cnta;
a[cnta].t=cntb;//cout<<lca(l,r)<<endl;
a[cnta].l=(lca(l,r)==l)?f[l]:g[l];
}
}
sort(a+1,a+cnta,cmp);
int l=1,r=0,t=1;
for(int i=1;i<=cnta;i++)
{
for(;t<=a[i].t;t++)
change(b[t].l,b[t].r);
for(;t>a[i].t;t--)
change(b[t].l,b[t].t);
while(l>a[i].l)
add(rl[--l]);
while(l<a[i].l)
add(rl[l++]);
while(r>a[i].r)
add(rl[r--]);
while(r<a[i].r)
add(rl[++r]);
int x=rl[l],y=rl[r],tmp=lca(x,y);//cout<<x<<" "<<y<<" "<<tmp<<endl;
if(x!=tmp&&y!=tmp)
{
add(tmp);
ans[a[i].rl]=sum;
add(tmp);
}
else
ans[a[i].rl]=sum;
}
for(int i=1;i<=cnta;i++)
printf("%lld\n",ans[i]);
return 0;
}
/*
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
*/
bzoj 3052: [wc2013]糖果公园【树上带修改莫队】的更多相关文章
- [WC2013][luogu4074] 糖果公园 [树上带修改莫队]
题面: 传送门 思路: 一道实现起来细节比较恶心的题目 但是其实就是一个裸的树上带修改莫队 好像树上莫队也出不了什么结合题目,不像序列莫队天天结合AC自动机.后缀数组...... 莫队学习请戳这里:莫 ...
- luogu4074 [WC2013]糖果公园(树上带修莫队)
link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...
- LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)
传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...
- BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)
题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- BZOJ 3052: [wc2013]糖果公园 | 树上莫队
题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...
- [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...
- bzoj 3052: [wc2013]糖果公园 带修改莫队
3052: [wc2013]糖果公园 Time Limit: 250 Sec Memory Limit: 512 MBSubmit: 506 Solved: 189[Submit][Status] ...
- 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)
题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...
- BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )
题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...
随机推荐
- 修改textfield的占位符颜色
[self.titleField setValue:UIColorFromHEXWithAlpha(0x999999, 1) forKeyPath:@"_placeholderLabel.t ...
- 分布式RPC框架性能大比拼
https://github.com/grpc/grpc http://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/ http ...
- 系统优化(一)Maven打包同一个jar有不同的:版本号+时间戳(解决思路)
解决:maven仓库的ear里面有非常多个同样的jar(仅仅是包括不同的:版本号+时间戳) 问题描写叙述: 发现ear里面有非常多个同样的jar,仅仅是包括不同的:版本号+时间戳,例如以下图所看到的: ...
- 解决pycharm下安装reportLab报错的问题
在利用pycharm中自带的第三方安装工具安装reportLab时提示安装失败.失败的原因是缺失第三方扩展包.经过查阅查阅资料了解到一些python的第三方扩展包是需要python-dev支持的.我装 ...
- CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏
CASE函数 作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...
- 初步认识Tensorflow
不多说,直接上干货! TensorFlow 是一个开源软件库,用于使用数据流图进行数值计算.换句话说,即是构建深度学习模型的最佳方式. Tensorflow的官网 https://www.tensor ...
- 从CakePHP 1.3升级到2.5
从CakePHP 1.3升级到2.5 摘要:最近把一个CakePHP 1.3的项目升级到了2.x,当然就用最新的版本2.5.3了,结果基本满意.本文记录了升级的过程,包括使用的工具,遇到的问题和相应的 ...
- File to byte[] in Java
File to byte[] in Java - Stack Overflow https://stackoverflow.com/questions/858980/file-to-byte-in-j ...
- Restrictions.or多个条件用法
两个条件或查询: Restrictions.or(Restrictions.in("username",list1),Restrictions.idEq(1)); 三个或多个条件查 ...
- hdu4908 & BestCoder Round #3 BestCoder Sequence(组合数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 BestCoder Sequence Time Limit: 2000/1000 MS (Jav ...