[WC2013][luogu4074] 糖果公园 [树上带修改莫队]
题面:
思路:
一道实现起来细节比较恶心的题目
但是其实就是一个裸的树上带修改莫队
好像树上莫队也出不了什么结合题目,不像序列莫队天天结合AC自动机、后缀数组......
莫队学习请戳这里:莫队
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
struct edge{
ll to,next;
}a[];
ll n,m,Q,first[],cntt,clk,block;
ll fa[],dep[],st[][],dfn[];
ll v[],w[],x[];
inline void add(ll u,ll v){
a[++cntt]=(edge){v,first[u]};first[u]=cntt;
a[++cntt]=(edge){u,first[v]};first[v]=cntt;
}
void dfs(ll u,ll f){
//cout<<"dfs "<<u<<" "<<f<<"\n";
ll i,v;
fa[u]=st[u][]=f;dep[u]=dep[f]+;dfn[u]=++clk;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(v==f) continue;
dfs(v,u);
}
}
void init(){
for(ll i=;i<=;i++){
for(ll j=;j<=n;j++){
st[j][i]=st[st[j][i-]][i-];
}
}
}
void _swap(ll &l,ll &r){l^=r;r^=l;l^=r;}
ll LCA(ll l,ll r){
//cout<<"lca "<<l<<" "<<r<<"\n";
if(dep[l]>dep[r]) _swap(l,r);
ll i;
for(i=;i>=;i--) if(dep[st[r][i]]>=dep[l]) r=st[r][i];
if(l==r) return l;
for(i=;i>=;i--){
if(st[l][i]!=st[r][i]){
l=st[l][i];r=st[r][i];
}
}
return fa[l];
}
ll curl,curr,curc,cntq,cntc,cnt[];bool vis[];
ll ans[],tot;
struct query{
ll l,r,c,i;
}q[];
bool cmp(query l,query r){
if(dfn[l.l]/block!=dfn[r.l]/block) return dfn[l.l]/block<dfn[r.l]/block;
else{
if(dfn[l.r]/block!=dfn[r.r]/block)
return dfn[l.r]/block<dfn[r.r]/block;
else return l.c<r.c;
}
}
struct change{
ll pos,to;
}c[];
void rev(ll i){
if(vis[i]) vis[i]=,tot-=v[x[i]]*w[cnt[x[i]]],cnt[x[i]]--;
else vis[i]=,cnt[x[i]]++,tot+=v[x[i]]*w[cnt[x[i]]];
//cout<<"rev node "<<i<<" "<<x[i]<<" "<<tot<<"\n";
}
void change(ll i){
//cout<<"change node "<<i<<" "<<c[i].pos<<" "<<c[i].to<<"\n";
if(!vis[c[i].pos]) _swap(c[i].to,x[c[i].pos]);
else{
rev(c[i].pos);
_swap(c[i].to,x[c[i].pos]);
rev(c[i].pos);
}
}
int main(){
memset(first,-,sizeof(first));
ll i,t1,t2,t3;
n=read();m=read();Q=read();block=(ll)pow(n,0.60);
for(i=;i<=m;i++) v[i]=read();
for(i=;i<=n;i++) w[i]=read();
for(i=;i<n;i++){
t1=read();t2=read();add(t1,t2);
}
for(i=;i<=n;i++) x[i]=read();
dfs(,);init();
//for(i=1;i<=n;i++) cout<<fa[i]<<" "<<dep[i]<<"\n";
for(i=;i<=Q;i++){
t1=read();t2=read();t3=read();
if(t1) q[++cntq].l=t2,q[cntq].r=t3,q[cntq].c=cntc,q[cntq].i=cntq;
else c[++cntc].pos=t2,c[cntc].to=t3;
//cout<<"finish read in "<<i<<"\n";
}
sort(q+,q+cntq+,cmp);
//for(i=1;i<=cntq;i++)
//cout<<q[i].l<<" "<<q[i].r<<" "<<q[i].c<<" "<<q[i].i<<"\n"; if(dfn[q[].l]>dfn[q[].r]) _swap(q[].l,q[].r);
ll lca=LCA(q[].l,q[].r),l,r;curl=q[].l;curr=q[].r;
l=curl;r=curr;
while(l!=lca) rev(l),l=fa[l];
while(r!=lca) rev(r),r=fa[r];
while(curc<q[].c) change(++curc);
rev(lca);ans[q[].i]=tot;rev(lca);
for(i=;i<=cntq;i++){
//cout<<"i=="<<i<<"\n";
if(dfn[q[i].l]>dfn[q[i].r]) _swap(q[i].l,q[i].r);
lca=LCA(curr,q[i].r);l=curr;r=q[i].r;
while(l!=lca) rev(l),l=fa[l];
while(r!=lca) rev(r),r=fa[r];
lca=LCA(curl,q[i].l);l=curl;r=q[i].l;
while(l!=lca) rev(l),l=fa[l];
while(r!=lca) rev(r),r=fa[r];
while(curc>q[i].c) change(curc--);
while(curc<q[i].c) change(++curc);
lca=LCA(q[i].l,q[i].r);
rev(lca);ans[q[i].i]=tot;rev(lca);
curl=q[i].l;curr=q[i].r;
}
for(i=;i<=cntq;i++) printf("%lld\n",ans[i]);
}
[WC2013][luogu4074] 糖果公园 [树上带修改莫队]的更多相关文章
- luogu4074 [WC2013]糖果公园(树上带修莫队)
link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...
- LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)
传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...
- 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)
题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...
- bzoj 3052: [wc2013]糖果公园【树上带修改莫队】
参考:http://blog.csdn.net/lych_cys/article/details/50845832 把树变成dfs括号序的形式,注意这个是不包含lca的(除非lca是两点中的一个) 然 ...
- BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)
题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...
- 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...
- BZOJ3052: [wc2013]糖果公园【树上带修莫队】
Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...
随机推荐
- 漫谈 Clustering (1): k-means
好久没有写 blog 了,一来是 blog 下线一段时间,而租 DreamHost 的事情又一直没弄好:二来是没有太多时间,天天都跑去实验室.现在主要折腾 Machine Learning 相关的东西 ...
- Bootstrap历练实例:响应式布局
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- React后台管理系统-商品列表搜索框listSearch组件
1.商品列表搜索框 2.搜索框页面的结构为 <div className="row search-wrap"> <div classN ...
- 第26题:LeetCode572:Subtree of Another Tree另一个树的子树
题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: ...
- Zabbix监控告警Lack of free swap space on Zabbix server解决办法
报错详情如下: 是因为Zabbix监控没有考虑虚拟主机的交换空间情况 解决办法修改配置 修改表达式内容:{Template OS Linux:system.swap.size[,pfree].last ...
- MySQL 如何生成日期表
MySQL 如何生成日期表 在开发过程中,经常会遇到统计问题,通常交易信息都不是连续的,此时,统计出来的数据都是不连续的,所以提前生成一个时期表,当没有交易数据的时候填充0,就可以了,下面是生成日期表 ...
- django处理上传文件配置
1.sttings中配置 'django.template.context_processors.media' TEMPLATES = [ { 'BACKEND': 'django.template. ...
- docker 学习(3)
docker和宿主之间的数据共享以及docker间的数据共享仍然是让人头疼和操心的地方. 几个基本概念: docker: 一种容器管理技术,这里也指既有的开发工具链. container: 容器 im ...
- 2018 Multi-University Training Contest 1 H - RMQ Similar Sequence(HDU - 6305 笛卡尔树)
题意: 对于一个序列a,构造一个序列b,使得两个序列,对于任意的区间 [l, r] 的区间最靠近左端点的那个最大值的位置,并且序列 b 满足 0 < bi < 1. 给定一个序列 a ,求 ...
- Asp.net Mvc Action重定向总结
摘自博客园 程晓晖 [HttpPost] public ActionResult StudentList( string StudName, string studName, DateT ...