【BZOJ3052&UOJ58】糖果公园(树上带修莫队)
题意:给定一个n个点的树,每个结点上有一种颜色c[i]
定义一条简单路径的偷税指数为simga (sigma w[i](i=0..a[j]))*v[j](j=0..m),其中a[i]为第i种颜色在路径上出现的次数
现在共有q个非强制在线的操作,格式为(op,x,y)
op=0时代表将x号点的颜色修改为y
op=1时询问(x,y)这条简单路径的偷税指数
思路:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 200010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=0x7fffffff;
int inf=1e9;
int dx[]={-,,,};
int dy[]={,,-,}; struct Q
{
int l,r,cur,id;
}q[M]; struct P
{
int x,pre,now;
}p[M]; int head[N],vet[N],nxt[N],w[N],c[N],cnt[N],tot,
f[N][],l[N],r[N],pos[N],dfn[N],to[N],dep[N],v[N],vis[N],b[N],tim1,tim2;
ll now,ans[N]; bool cmp(Q a,Q b)
{
return pos[a.l]<pos[b.l]
||pos[a.l]==pos[b.l]&&pos[a.r]<pos[b.r]
||pos[a.l]==pos[b.l]&&pos[a.r]==pos[b.r]&&a.cur<b.cur;
} int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs(int u,int fa)
{
rep(i,,) f[u][i]=f[f[u][i-]][i-];
dfn[u]=++tim1;
l[u]=++tim2; to[tim2]=u;
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa)
{
dep[v]=dep[u]+;
f[v][]=u;
dfs(v,u);
}
e=nxt[e];
}
r[u]=++tim2; to[tim2]=u;
} int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
int d=dep[x]-dep[y];
rep(i,,)
if(d>>i&) x=f[x][i];
per(i,,)
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
if(x==y) return x;
return f[x][];
} void go(int x)
{
if(vis[x])
{
now-=1ll*v[c[x]]*w[cnt[c[x]]];
cnt[c[x]]--;
}
else
{
cnt[c[x]]++;
now+=1ll*v[c[x]]*w[cnt[c[x]]];
}
vis[x]^=;
} void update(int x,int y)
{
if(vis[x])
{
go(x);
c[x]=y;
go(x);
}
else c[x]=y;
} int main()
{
int n=read(),m=read(),k=read();
int S=max(,(int)pow(n,2.0/));
rep(i,,m) v[i]=read();
rep(i,,n) w[i]=read();
tot=;
rep(i,,n) head[i]=;
rep(i,,n-)
{
int x=read(),y=read();
add(x,y);
add(y,x);
}
rep(i,,n)
{
c[i]=read();
b[i]=c[i];
} tim1=tim2=;
dfs(,);
rep(i,,tim2) pos[i]=(i-)/S;
int l1=,l2=;
rep(i,,k)
{
int op=read(),x=read(),y=read();
if(op==)
{
l2++;
p[l2].x=x;
p[l2].pre=b[x];
p[l2].now=b[x]=y;
}
else
{
l1++;
if(dfn[x]>dfn[y]) swap(x,y);
int t=lca(x,y);
if(t==x) q[l1].l=l[x];
else q[l1].l=r[x];
q[l1].r=l[y];
q[l1].id=l1;
q[l1].cur=l2;
}
}
sort(q+,q+l1+,cmp);
int L=,R=,T=;
now=;
rep(i,,l1)
{
while(T<q[i].cur)
{
T++;
update(p[T].x,p[T].now);
}
while(T>q[i].cur)
{
update(p[T].x,p[T].pre);
T--;
}
while(L>q[i].l) go(to[--L]);
while(L<q[i].l) go(to[L++]);
while(R>q[i].r) go(to[R--]);
while(R<q[i].r) go(to[++R]);
int x=to[L],y=to[R],t=lca(x,y);
if(x!=t&&y!=t) go(t);
ans[q[i].id]=now;
if(x!=t&&y!=t) go(t);
}
rep(i,,l1) printf("%lld\n",ans[i]);
return ;
}
【BZOJ3052&UOJ58】糖果公园(树上带修莫队)的更多相关文章
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- luogu4074 [WC2013]糖果公园(树上带修莫队)
link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...
- LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)
传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...
- [WC2013][luogu4074] 糖果公园 [树上带修改莫队]
题面: 传送门 思路: 一道实现起来细节比较恶心的题目 但是其实就是一个裸的树上带修改莫队 好像树上莫队也出不了什么结合题目,不像序列莫队天天结合AC自动机.后缀数组...... 莫队学习请戳这里:莫 ...
- BZOJ3052: [wc2013]糖果公园【树上带修莫队】
Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...
- BZOJ 3052/Luogu P4074 [wc2013]糖果公园 (树上带修莫队)
题面 中文题面,难得解释了 BZOJ传送门 Luogu传送门 分析 树上带修莫队板子题... 开始没给分块大小赋初值T了好一会... CODE #include <bits/stdc++.h&g ...
- BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )
题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...
- bzoj4129 Haruna’s Breakfast 树上带修莫队+分块
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...
- BZOJ 3052 树上带修莫队
思路: 就是把带修莫队移到了树上 块的大小开到(n^2/3)/2 比较好- 这是一个卡OJ好题 //By SiriusRen #include <cmath> #include <c ...
- BZOJ3052(树上带修莫队)
树上莫队的基本思路是把树按dfs序分块,然后先按x所在块从小到大排序,再按y所在块从小到大排序,处理询问即可. 这道题带修改,再加一个时间维即可. 设块大小为T,那么时间复杂度为$O(nT+\frac ...
随机推荐
- pycharm5.0.4简易使用说明
前言:学习自动化,需要使用pycharm,以下是简易使用说明 1.注册破解 2.行号和背景色 3.打断点 1.注册破解 打开pycharm5.0.4,点击菜单栏的help->register.. ...
- 【ABAP系列】SAP ABAP与Java数据类型的对应关系
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP与Java数据类 ...
- 基于docker registry镜像安装私服docker hub
采用docker registry镜像安装docker私服,通过https://hub.docker.com/_/registry链接搜索registry镜像 1.输入命令:docker pull r ...
- jmeter设置全局变量token
返回登录后的token使用json path Extractor插件,定位到获取后的token为变量 在登录下后置处理器下添加json path Extracto插件 根据上面获取到的token位置路 ...
- mybatis报错:org.apache.ibatis.builder.BuilderException:Encountered " "shr" "shr " " at line 1,column 1
程序报错如下: 解决:变量名冲突 表字段‘审核人’简称为shr,与mybatis的OGNL表达式发生冲突. 解决方法:修改冲突的变量名即可. 总结了一下变量命名可能发生冲突的变量集合: bor(字符| ...
- 数据溢出-varchar类型
数据溢出一.varchar(65535)1.在charset=latin1,因为有额外的开销,实际只能存65532 CREATE table demo( a ) )charset=latin1 eng ...
- [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)
[Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...
- 解决Linux下编译.sh文件报错 “[: XXXX: unexpected operator”
本人经常在Linux通过编译 .sh文件来生成工程,之前一直都没问题,代码一直都没变,但是今天编译的时候,却提示错误:
- C语言接口
struct i_foo * foobar_foo(void); //返回接口指针struct foo_object * foo_create(struct i_foo *iface, void *d ...
- matlab批量修改变量的名称
使用matlab做实验的时候,保存的文件里面的变量名都是一样的 ,所以希望能够把变量名全部都重命名.我举个个例子,假设我一堆文件,文件名分别是gds1,gds2,gds2,-.. 但是实际上load进 ...