【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 ...
随机推荐
- frei0r-1.6.1 for win32 133 DLLs
ffmpeg中frei0r滤镜基本使用方法 ffplay -vf frei0r=filter_name=filter_params:filter_params:... 在Windows系统ffmpeg ...
- Ubuntu 关闭触摸板
1.关闭 sudo modporbe -r psmouse 2.开启 sudo modprobe psmouse
- python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作
python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...
- 使用nvidia-smi命令查看显卡信息
安装: 1.先安装tensorflow-gpu,需要查看对应的版本,通过pycharm运行程序时会报错,提示需要安装CUDA,且会指明需要版本号 >> pip install tensor ...
- Golang channel 特性
最近在项目中遇到了 Go channel 的一些问题,在此记录下 close channel 的一些特性. 关闭channel ch := make(chan bool) close(ch) clos ...
- ThinkPHP框架整合phpqrcode生成二维码DEMO
ThinkPHP框架发展到今天功能已经变得是非常强大了,但是ThinkPHP框架中没有二维码相关的库,因此我们可以通过整合phpqrcode来完成生成二维码的功能.想使用phpqrcode首先就要把p ...
- 前端 ---jQuery的补充
15-jQuery补充 jquery内容补充 jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryu ...
- select下拉框插件jquery.editable-select
项目中有个需求,下拉框既可以下拉选择,也可以手动填写 html代码 <span>数据来源</span> </select> js代码 $('#noMean').ed ...
- LuoGu P1352 没有上司的舞会
题目传送门 这可能是最简单的树形Dp了吧 对于每个人,要么他来,他的下属不来 要么他不来,他的下属爱来不来 于是设计状态: f[i][0/1]表示以i为根的子树中最大能达到的快乐值(i这个人选或者不选 ...
- Windows下Oracle 11g的下载与安装
Windows下Oracle的下载与安装 一.Oracle下载 官网地址:http://www.oracle.com/technetwork/database/enterprise-edition/d ...