原题链接

题解

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

答案是当前重心距离不超过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. pl sql 中文乱码

    一:查看oracle数据库的字符集编码: select * fromnls_database_parameters where parameter in ('NLS_LANGUAGE', 'NLS_T ...

  2. OpenStack实践系列④计算服务Nova

    OpenStack实践系列④计算服务Nova 3.6 Nova控制节点的部署创建服务的凭证,完成下列步骤: 创建nova用户,并加入到service项目中,赋予admin权限 [root@node1 ...

  3. event & signals & threads

    The Event Systemhttp://doc.qt.io/qt-4.8/eventsandfilters.html Each thread can have its own event loo ...

  4. Android来电拦截及来电转移

    1. 电话拦截这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现.这个就不说了,在附件的代码里有.2.拦截后提示忙音/空号/已关机/已停机这个功能其实是要用到MMI指令 ...

  5. bootstrap Autocomplete

    首先应用文件(已上传到文件,需要可自行下载) <link href="~/bower_components/select2/dist/css/select2.css" rel ...

  6. Redis Lua脚本调试

    从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支 ...

  7. PID控制器开发笔记之八:带死区的PID控制器的实现

    在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定.为了解决这种情况,我们可以引入带死区的PID算法. 1.带死区PID的基本思想 带死区的PID控制算法 ...

  8. Ubuntu16.04安装Maven3.5.4

      本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS Maven 版本:Apache Maven 3.5.4 JDK 版本:J ...

  9. Confluence 6 连接到 Jira 用户管理的建议

    建议 如果下面所有的选项都为是的话: JIRA 应用程序不在高负载下运行. 你仅仅希望在一些不多的应用中跨平台管理你的用户和用户组,例如一个 JIRA 软件服务器和 Confluence 服务器,或者 ...

  10. ES6学习路上的小学生,promise处理异步操作,简易原始起步之用。先能用,再深究!

    ES6的promise对象,让我们更容易的处理这样的需求:执行完一个方法以后,再去执行下一个方法. 理解尚浅之时,先用于项目之中. var promise1 = new Promise(functio ...