[BZOJ4372]烁烁的游戏(动态点分治+线段树)
和[BZOJ3730]震波几乎一样,每个点建两棵线段树分别代表它的管辖范围内以它为LCA的路径的贡献和它对父亲的贡献。
注意点分树上的点的距离在原树上不单调,所以不能有若距离超出限制就break之类的判断。
#include<cstdio>
#include<algorithm>
#define lson ls[x],L,mid
#define rson rs[x],mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,M=;
char ch;
int n,m,u,v,rt,x,d,w,nd,cnt,tim,dep[N],dfn[N],fa[N],lg2[N],sz[N];
int h[N],to[N<<],nxt[N<<],sm[M],ls[M],rs[M],mn[N][],rt1[N],rt2[N],f[N],vis[N]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void dfs(int x,int fa){
dep[x]=dep[fa]+; mn[++tim][]=dep[x]; dfn[x]=tim;
For(i,x) if ((k=to[i])!=fa) dfs(k,x),mn[++tim][]=dep[x];
} int dis(int x,int y){
int l=dfn[x],r=dfn[y];
if (l>r) swap(l,r);
int t=lg2[r-l+];
return dep[x]+dep[y]-*min(mn[l][t],mn[r-(<<t)+][t]);
} void find(int x,int F,int S,int &rt){
sz[x]=; f[x]=;
For(i,x) if ((k=to[i])!=F && !vis[k])
find(k,x,S,rt),sz[x]+=sz[k],f[x]=max(f[x],sz[k]);
f[x]=max(f[x],S-sz[x]);
if (f[x]<f[rt]) rt=x;
} void devide(int x){
vis[x]=;
For(i,x) if (!vis[k=to[i]]){
int rt=; find(k,x,sz[k],rt); fa[rt]=x; devide(rt);
}
} void mdf(int &x,int L,int R,int pos,int k){
if (!x) x=++nd; sm[x]+=k;
if (L==R) return;
int mid=(L+R)>>;
if (pos<=mid) mdf(lson,pos,k); else mdf(rson,pos,k);
} int que(int x,int L,int R,int pos){
if (L==R) return sm[x];
int mid=(L+R)>>;
if (pos<=mid) return sm[rs[x]]+que(lson,pos);
else return que(rson,pos);
} void Mdf(int x,int d,int w){
for (int i=x; i; i=fa[i]){
if (d>=dis(i,x)) mdf(rt1[i],,n,d-dis(i,x),w);
if (fa[i] && d>=dis(fa[i],x)) mdf(rt2[i],,n,d-dis(fa[i],x),w);
}
} int Que(int x){
int res=;
for (int i=x; i; i=fa[i]){
res+=que(rt1[i],,n,dis(i,x));
if (fa[i]) res-=que(rt2[i],,n,dis(fa[i],x));
}
return res;
} int main(){
freopen("bzoj4372.in","r",stdin);
freopen("bzoj4372.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(,);
rep(j,,) rep(i,,tim-(<<j)+)
mn[i][j]=min(mn[i][j-],mn[i+(<<(j-))][j-]);
lg2[]=; rep(i,,tim) lg2[i]=lg2[i>>]+;
f[]=n+; find(,,n,rt); devide(rt);
rep(i,,m){
scanf(" %c",&ch);
if (ch=='Q') scanf("%d",&x),printf("%d\n",Que(x));
else scanf("%d%d%d",&x,&d,&w),Mdf(x,d,w);
}
return ;
}
[BZOJ4372]烁烁的游戏(动态点分治+线段树)的更多相关文章
- BZOJ4372烁烁的游戏——动态点分治+线段树(点分树套线段树)
题目描述 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠.皮皮鼠会被 ...
- [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]
题面 传送门 思路 观察一下题目,要求的是修改"距离点$u$的距离一定的点权值",那这个就不能用传统的dfs序类算法+线段树维护,因为涉及到向父亲回溯的问题 看到和树上距离相关的东 ...
- 【bzoj4372】烁烁的游戏 动态点分治+线段树
题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...
- bzoj 4372: 烁烁的游戏 动态点分治_树链剖分_线段树
[Submit][Status][Discuss] Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳 ...
- BZOJ4372: 烁烁的游戏(动态点分治)
Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮 ...
- 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树
题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...
- 【bzoj3730】震波 动态点分治+线段树
题目描述 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着时代的发展,城市 ...
- 2019ICPC上海网络赛 A Lightning Routing I 点分树(动态点分治)+线段树
题意 给一颗带边权的树,有两种操作 \(C~e_i~w_i\),将第\(e_i\)条边的边权改为\(w_i\). \(Q~v_i\),询问距\(v_i\)点最远的点的距离. 分析 官方题解做法:动态维 ...
- BZOJ4372 烁烁的游戏(动态点分治+线段树)
建出点分树,每个节点维护其作为点分树上lca对子树内点的贡献,线段树维护即可,同时另开一个线段树以减掉父亲重复的贡献. #include<iostream> #include<cst ...
随机推荐
- MUI项目基础框架
码云SVN仓库地址:https://gitee.com/lim2018/vx/tree/master MUI项目基础框架,底部导航栏切换 目录结构 index为入口页主体,sub1-4为要切换的子页面 ...
- PostgreSQL内核分析——BTree索引
文中附图参考至<PostgreSQL数据库内核分析> (一)概念描述 B+树是一种索引数据结构,其一个特征在于非叶子节点用于描述索引,而叶子节点指向具体的数据存储位置.在PostgreSQ ...
- 关于app的cpu占用率想到的几个问题
1.top 命令获取的cpu是手机瞬间的cpu 2.dumpsys获取的是一段时间cpu的平均值?那么这段时间是指哪段,从哪开始到什么时候结束? 3.如果想测试app某操作下的cpu占用情况时候.应该 ...
- 如何调整Linux内核启动中的驱动初始化顺序-驱动加载优先级
Linux内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏: include\linux\init.h #define pure_initcall(fn) __define_initcall(& ...
- Robotium测试套管理测试用例
前提:已写好测试用例 新建个测试套MyTestSuite管理你需要跑的测试用例,或者将相同功能的测试用例归纳到一个测试套中 package com.robotium.test.testsuite; i ...
- wordcount在本地运行报错解决:Exception in thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.native.NativeID$Windows.access
在windows中的intellij中运行wordcount程序,控制台输出以下报错 在Intellij编辑器中解决办法:本地重新创建NativeIO类,修改一个方法返回值,然后用新建的NativeI ...
- 30 C? Go? Cgo!
C? Go? Cgo! 17 March 2011 Introduction Cgo lets Go packages call C code. Given a Go source file writ ...
- GMM 模型需不需归一化问题
工作中遇到的问题:在GMM模型中添加一维scale比较大的特征,需不需要归一化 答案:不需要,推导如下:
- 使用html+css+js实现日历与定时器,看看今天的日期和今天剩余的时间。
使用html+css+js实现日历与定时器,看看今天的日期和今天剩余的时间. 效果图: 哎,今天就又这么过去了,过的可真快 . 代码如下,复制即可使用: <!DOCTYPE html> & ...
- HDU 2476 String painter(区间DP+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...