https://www.luogu.com.cn/problem/P6329

先建一颗点分树
考虑树上的每个节点维护什么
因为树高是log的,所以怎么暴力怎么维护就好了

维护两个前缀和, u u u的子树的点距离 u u u点的距离为 i i i的个数
以及对于 f a [ u ] fa[u] fa[u]的
然后一路往上跳,每次加上fa[u]的减去u的即可
相当于市点分治的减去重复计算的部分
空间处理用vector即可
code:

#include<bits/stdc++.h>
#define N 500050
using namespace std;
struct edge {int v, nxt;
} e[N << 1];
int p[N], eid;
void init() {memset(p, - 1, sizeof p);eid = 0;
}
void insert(int u, int v) {e[eid].v = v;e[eid].nxt = p[u];p[u] = eid ++;
}
int dep[N], fa[N][20];
int LCA(int x, int y) {if(dep[x] < dep[y]) swap(x, y);for(int i = 18; i >= 0; i --) if(dep[fa[x][i]] >= dep[y]) x = fa[x][i];if(x == y) return x;for(int i = 18; i >= 0; i --) if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];return fa[x][0];
}
int dis(int x, int y) {return dep[x] + dep[y] - 2 * dep[LCA(x, y)];
}
void dfsp(int u) {dep[u] = dep[fa[u][0]] + 1;for(int i = p[u]; i + 1; i = e[i].nxt) {int v = e[i].v;if(v == fa[u][0]) continue;fa[v][0] = u; dfsp(v);}
}
vector<int> t[2][N];
int size[N], msize[N], vis[N], FA[N];
int sz, mx, rt;
void dfs(int u, int ff) {size[u] = 1; msize[u] = 0;for(int i = p[u]; i + 1; i = e[i].nxt) {int v = e[i].v;if(v == ff || vis[v]) continue;dfs(v, u); size[u] += size[v];msize[u] = max(msize[u], size[v]);}msize[u] = max(msize[u], sz - size[u]);if(msize[u] < mx) mx = msize[u], rt = u;
}
void solve(int u, int ff, int n) {mx = sz = n, rt = 0;dfs(u, u); u = rt;FA[u] = ff; size[u] = sz;t[0][u].resize(sz + 5), t[1][u].resize(sz + 5);vis[u] = 1;for(int i = p[u]; i + 1; i = e[i].nxt) {int v = e[i].v;if(vis[v]) continue;solve(v, u, size[v]);}
}
#define lowbit(x) (x & -x)
void update(int o, int u, int x, int y) { ++ x;for(; x <= size[u] + 1; x += lowbit(x)) t[o][u][x] += y;
}
int query(int o, int u, int x) { x = min(x + 1, size[u] + 1);int ret = 0;for(; x; x -= lowbit(x)) ret += t[o][u][x];return ret;
}
void Add(int x, int y) {for(int i = x; i; i = FA[i]) update(0, i, dis(i, x), y);for(int i = x; FA[i]; i = FA[i]) update(1, i, dis(FA[i], x), y);
}
int n, m, val[N];
int main() {init();scanf("%d%d", &n, &m);for(int i = 1; i <= n; i ++) scanf("%d", &val[i]);for(int i = 1; i < n; i ++) {int u, v;scanf("%d%d", &u, &v);insert(u, v), insert(v, u);}dfsp(1);for(int j = 1; j <= 18; j ++)for(int i = 1; i <= n; i ++) fa[i][j] = fa[fa[i][j - 1]][j - 1];solve(1, 0, n);for(int i = 1; i <= n; i ++) Add(i, val[i]);int lst = 0;while(m --) {int o, x, y;scanf("%d%d%d", &o, &x, &y);x ^= lst, y ^= lst;if(!o) {lst =  query(0, x, y);for(int i = x; FA[i]; i = FA[i]) {int d = dis(x, FA[i]);if(d <= y) lst += query(0, FA[i], y - d) - query(1, i, y - d);} printf("%d\n", lst);} else Add(x, y - val[x]), val[x] = y;}return 0;
}

luogu P6329 【模板】点分树 | 震波相关推荐

  1. P6329 【模板】点分树 | 震波

    P6329 [模板]点分树 | 震波 这是一道模板题,需要支持两个操作,操作一就是单点修改点权,操作二就是查询距离x不超过k的点权值和. 我们考虑建出点分树,然后对于每个点维护两个数据结构,一个处理当 ...

  2. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  3. P6329-[模板]点分树 | 震波

    正题 题目链接:https://www.luogu.com.cn/problem/P6329 解题思路 给出nnn个点的一棵树,每个点有权值,有mmm次操作 修改一个点xxx的权值为yyy 询问距离点 ...

  4. 线段树练习 3P3372 【模板】线段树 1

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  5. P3373 【模板】线段树 2

    P3373 [模板]线段树 2 相对于线段树模板1有了区间乘的操作,所以增加了一个乘的延迟标记,当加和乘的次序不同的时候,我们要好好考虑这两个延迟标记对孩子的影响.所以这里我们是采取的是先乘后加. 线 ...

  6. P5311-[Ynoi2011]成都七中【点分树,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P5311 题目大意 给出nnn个点的一棵树,每个节点有一个颜色,mmm次询问提出区间[l,r][l,r][l,r]的 ...

  7. P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】

    正题 题目链接:https://www.luogu.com.cn/problem/P3345 题目大意 nnn个点的一棵树,每次修改一个点的点权后询问一个xxx最小化∑y=1ndis(x,y)∗dy\ ...

  8. P2056-[ZJOI2007]捉迷藏【点分树,堆】

    正题 题目链接:https://www.luogu.com.cn/problem/P2056 题目大意 nnn个点的一棵树,开始全是黑点,有操作 取反一个点的颜色 求最远的黑点之间的距离 解题思路 根 ...

  9. 【模板篇】树状数组们(三)

    UPD: 本篇有了一个更通(hui)俗(se)易(nan)懂的讲解, 大家可以移步这里围观~(使用了latex推柿子, 带给你不一样的清新体验~ ok,以上两期稍稍讲了一下树状数组的基本功能.. 最最 ...

最新文章

  1. [Linux] 批量添加用户
  2. 全球及中国特殊教育行业十四五趋势展望与发展战略建议报告2022版
  3. mvc html根目录,c#-路由到ASP.NET MVC中的根目录
  4. Flume架构及应用
  5. 1046. 划拳(15)
  6. loadrunner linux 端口,Linux下loadrunner generator的安装
  7. python如何提高程序可读性_提高Python的可读性?
  8. Vim/Vi常用操作(第二版)
  9. 信息学奥赛一本通 1061:求整数的和与均值 | OpenJudge NOI 1.5 04
  10. 大数——大数阶乘(hdu1042)
  11. linux dup跨进程使用,linuxC多进程通讯---无名管道dup
  12. mysql 跳过checksum_MySQL-Utilities:mysqldbcompare及跳过复制错误
  13. bartlett方差齐性检验_数据总体分布检验
  14. 怎么用xmind整理我们获取的杂乱的信息
  15. android 9.0 c7Pro,三星c7pro和vivo x9哪个好?三星Galaxy c7 pro和vivo x9区别对比评测
  16. 得力人脸识别考勤机密码设置_人脸指纹混合识别考勤机得力怎么使用
  17. 电脑和开发板如何串口连接
  18. 阿里云服务器apt install 出错怎么办?出现Package gdb is not available, but is referred to by another package怎么办
  19. Widget-苹果.谷歌和诺基亚着迷的网络新思维
  20. 大数据就业前景怎么样?hadoop工程师、数据挖掘、数据分析师薪资多少?

热门文章

  1. Python中判断文本是否为数字,类似excel isnumber的功能
  2. python-机器学习(课程记录一)
  3. 多路型DMA接口的工作原理
  4. Unity3D Shader:动态翅膀
  5. 网络攻击-arp攻击
  6. 褚时健:企业家应该具备这三种品质!
  7. java把字符转化为整型_Java开发笔记(三十二)字符型与整型相互转化
  8. 算法设计(1)--内排序算法小结
  9. 学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
  10. FineUI初学手册