【BZOJ】3730: 震波
题解
查询距离一个点距离在一定范围内的点,直接点分树,前缀和用树状数组维护
答案是当前重心距离不超过k - (x到重心距离)的点的前缀和,减去在x所在子树中,距离重心不超过k - (x到重心距离)的前缀和
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int lowbit(int x) {
return x & (-x);
}
struct BIT {
vector<int64> v;
void init(int n) {
for(int i = 1 ; i <= n + 1 ; ++i) v.pb(0);
}
void Insert(int x,int64 p) {
while(x < v.size()) {
v[x] += p;
x += lowbit(x);
}
}
int64 Query(int x) {
int64 res = 0;
x = min(x,(int)v.size() - 1);
while(x > 0) {
res += v[x];
x -= lowbit(x);
}
return res;
}
};
struct node {
int to,next;
}E[MAXN * 2];
struct pdt {
BIT rt,pre;
vector<int> aux,sub,dep;
}tr[MAXN];
int head[MAXN],sumE;
int N,M,d[MAXN];
int64 val[MAXN];
bool vis[MAXN];
vector<int> poi;
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
int Calc_G(int st) {
static int fa[MAXN],siz[MAXN],son[MAXN],que[MAXN],ql,qr;
ql = 1,qr = 0;
que[++qr] = st;
fa[st] = 0;siz[st] = 1;son[st] = 0;
while(ql <= qr) {
int u = que[ql++];
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa[u] && !vis[v]) {
fa[v] = u;siz[v] = 1;son[v] = 0;que[++qr] = v;
}
}
}
int res = que[qr];
for(int i = qr ; i >= 1 ; --i) {
int u = que[i];
if(fa[u]) {
siz[fa[u]] += siz[u];
son[fa[u]] = max(son[fa[u]],siz[u]);
}
son[u] = max(son[u],qr - siz[u]);
if(son[u] < son[res]) res = u;
}
return res;
}
int get_max_dep(int u,int fa) {
d[u] = d[fa] + 1;
int res = d[u];
poi.pb(u);
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v] && v != fa) {
res = max(res,get_max_dep(v,u));
}
}
return res;
}
void dfs_divide(int u) {
int G = Calc_G(u);
vis[G] = 1;
d[G] = 1;
poi.clear();
tr[G].rt.init(get_max_dep(G,0));
for(int i = 0 ; i < poi.size() ; ++i) {
tr[G].rt.Insert(d[poi[i]],val[poi[i]]);
tr[poi[i]].aux.pb(G);
tr[poi[i]].dep.pb(d[poi[i]]);
}
for(int i = head[G] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v]) {
int s = Calc_G(v);
poi.clear();
tr[s].pre.init(get_max_dep(v,G));
for(int j = 0 ; j < poi.size() ; ++j) {
tr[poi[j]].sub.pb(s);
tr[s].pre.Insert(d[poi[j]],val[poi[j]]);
}
}
}
for(int i = head[G] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v]) dfs_divide(v);
}
}
void Init() {
read(N);read(M);
int u,v;
for(int i = 1 ; i <= N ; ++i) read(val[i]);
for(int i = 1 ; i < N ; ++i) {
read(u);read(v);
add(u,v);add(v,u);
}
dfs_divide(1);
}
int64 Calc(int x,int k) {
int64 res = 0;
for(int i = tr[x].aux.size() - 1 ; i >= 0 ; --i) {
int u = tr[x].aux[i];
res += tr[u].rt.Query(k + 2 - tr[x].dep[i]);
}
for(int i = tr[x].sub.size() - 1 ; i >= 0 ; --i) {
int u = tr[x].sub[i];
res -= tr[u].pre.Query(k + 2 - tr[x].dep[i]);
}
return res;
}
void Change(int x,int y) {
for(int i = tr[x].aux.size() - 1 ; i >= 0 ; --i) {
int u = tr[x].aux[i];
tr[u].rt.Insert(tr[x].dep[i],-val[x]);
tr[u].rt.Insert(tr[x].dep[i],y);
}
for(int i = tr[x].sub.size() - 1 ; i >= 0 ; --i) {
int u = tr[x].sub[i];
tr[u].pre.Insert(tr[x].dep[i],-val[x]);
tr[u].pre.Insert(tr[x].dep[i],y);
}
val[x] = y;
}
void Solve() {
int la = 0;
int x,op,y;
for(int i = 1 ; i <= M ; ++i) {
read(op);read(x);read(y);
x = x ^ la;y = y ^ la;
if(op == 0) {
la = Calc(x,y);
out(la);enter;
}
else {
Change(x,y);
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}
【BZOJ】3730: 震波的更多相关文章
- bzoj 3730 震波——动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...
- bzoj 3730 震波 —— 动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 建点分树,每个点记两个树状数组,存它作为重心管辖的范围内,所有点到它的距离情况和到它在 ...
- bzoj:3730: 震波
Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着时 ...
- bzoj 3730 震波 (动态点分治)
大意: 给定n节点树, 每个节点有权值, 边权全为1. 给定m个操作: 操作1: (0,x,k) 表示询问到节点x距离不超过k的节点权值和 操作2: (1,x,y) 表示将节点x的权值修改为y 对于所 ...
- bzoj 3730: 震波 动态点分治_树链剖分_线段树
##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...
- BZOJ -3730(动态点分治)
题目:在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的 ...
- BZOJ3730 震波 和 BZOJ4372 烁烁的游戏
"震波"题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Log ...
- 【BZOJ-3730】震波 动态点分治 + 树状数组
3730: 震波 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 626 Solved: 149[Submit][Status][Discuss] D ...
- bzoj 4372 烁烁的游戏——动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 和 bzoj 3070 震波 是一个套路.注意区间修改的话,树状数组不能表示 dis ...
随机推荐
- IEnumerable和IEnumerator使用
IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象. IEnumerator是一个真正的集合访问器,没 ...
- ORACLE IMPDP导入报表数据已存在
背景 搞了这么多年oracle,不论是开发和运维,自认为是都了解了,和dba差的只是熟练的问题,因为毕竟不是天天搞它.不过突然听说数据泵导入的功能,大吃一惊,好像有印象,以为是落后的,一查,竟然是先进 ...
- oracle11g自动内存管理
Oracle一直不停的在为Orace数据库的自动化管理努力着,11G中的自动内存管理是Oracle数据库中又一新的里程碑,通过新参数MEMORY_TARGET 来代替PGA和SGA的配置,ORACLE ...
- Android Day1
[2013-10-04 9:49] 复习第一课. Building Your First App; 1.安装好SDK 后,启动Eclipse,新建一个Android工程.设置使用默认. 2.检查文件 ...
- 029_mount bind挂载
一. 由于公司的配置标准并不统一,交付的磁盘挂载的路径不是想要的路径,但是 1./home目录下有很重要的堡垒机登录的相关文件,还不能卸载 2.我通过pts/0登录的,这个文件描述符也是在/home目 ...
- mybatis:三种参数传递(转载)
转载自:https://www.2cto.com/database/201409/338155.html 第一种方案 DAO层的函数方法 Public User selectUser(String n ...
- 【原创】Linux基础之windows linux双系统
1 下载iso opensuse 下载: http://download.opensuse.org/distribution/openSUSE-stable/iso/openSUSE-Leap-15. ...
- python基础--管理目录与文件
1) 文件夹 os.listdir() #显示文件夹下所有文件 os.getcwd() #获取当前工作目录 os.chdir() #切换目录 os.mkdir() #建立目录 os.path.exis ...
- AndroidManifest.xml 最全详解
AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...
- nginx+ssl 服务器 双向认证
项目后台服务器采用nginx+tomcat 负载均衡架构 不久 访问协议有http升级为https 对服务器认证采用沃通的ssl证书 nginx ssl证书安装 参照沃通官方文档 他们有技术支持沟通 ...