原题链接

题解

查询距离一个点距离在一定范围内的点,直接点分树,前缀和用树状数组维护

答案是当前重心距离不超过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: 震波的更多相关文章

  1. bzoj 3730 震波——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...

  2. bzoj 3730 震波 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 建点分树,每个点记两个树状数组,存它作为重心管辖的范围内,所有点到它的距离情况和到它在 ...

  3. bzoj:3730: 震波

    Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着时 ...

  4. bzoj 3730 震波 (动态点分治)

    大意: 给定n节点树, 每个节点有权值, 边权全为1. 给定m个操作: 操作1: (0,x,k) 表示询问到节点x距离不超过k的节点权值和 操作2: (1,x,y) 表示将节点x的权值修改为y 对于所 ...

  5. bzoj 3730: 震波 动态点分治_树链剖分_线段树

    ##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...

  6. BZOJ -3730(动态点分治)

    题目:在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的 ...

  7. BZOJ3730 震波 和 BZOJ4372 烁烁的游戏

    "震波"题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  autoint Log ...

  8. 【BZOJ-3730】震波 动态点分治 + 树状数组

    3730: 震波 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 626  Solved: 149[Submit][Status][Discuss] D ...

  9. bzoj 4372 烁烁的游戏——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 和 bzoj 3070 震波 是一个套路.注意区间修改的话,树状数组不能表示 dis ...

随机推荐

  1. 构造函数中base与this的区别

    base是对父类的引用,而this是对类本身的引用. namespace ConsoleApplication1 { public class BaseClass { private string n ...

  2. 用layui前端框架弹出form表单以及提交

    第一步:引用两个文件 第二步:点击删除按钮弹出提示框 /*删除开始*/ $(".del").click(function () { var id = $(this).attr(&q ...

  3. Tp5自定义标签

    'taglib_build_in'    => 'cx,tags', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序 <?php namespace thin ...

  4. Python split()

    split翻译为分裂.  split()就是将一个字符串分裂成多个字符串组成的列表. split()当不带参数时以空格进行分割,当代参数时,以该参数进行分割. //---当不带参数时 example: ...

  5. linux学习之软件包安装

    本学习基于redhat系统或者centos系统 一.软件包的安装 1.rpm安装,rpm安装分为俩种,一种是直接安装xxx.rpm包,另一种是通过yum安装一系列的rpm包. #推荐使用yum安装,y ...

  6. swift 学习- 20 -- 错误处理

    // 错误处理 是响应错误以及 从错误中恢复的过程, Swift 提供了在运行时对 可恢复错误的 抛出, 捕获, 传递 和 操作的支持 // 某些操作无法保证总是执行完所有代码 或总是生层有用结果, ...

  7. 信息摘要算法之七:SHA在区块链中的应用

    最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...

  8. Oracle基础

    一.Oracle数据库与实例区分 Oracle数据库是存在电脑磁盘中的文件 实例是存在内存中的进程 我们是通过操作实例间接操作数据库的 我们操作结果都存在内存缓存中,当我们提交事务时,才将修改数据记录 ...

  9. SpringBoot事务管理

    1.在UserMapper接口中添加更新和删除方法 package com.cppdy.mapper; import org.apache.ibatis.annotations.Delete; imp ...

  10. Mybait缓存机制

    MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持. 一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空. 二级缓存:二级缓 ...