題目描述:
給一顆n個節點的樹,邊權均為1,初始點權均為0,m次操作:
q x:詢問x的點權。
m x d w:將樹上與節點x距離不超過d的節點的點權均加上w。
n,m<=105,|w|<=104
題目分析:
每個點分中心維護乙個樹狀陣列記錄對子樹某個距離的加權,再維護乙個記錄點分樹上的父親由自己這棵子樹貢獻上去的加權,用於去除重複計算。
區間加,單點查即可。
寫的時候意識到求距離可以不用lca,直接在dfs的時候就可以存下來了,多記錄乙個每個點對應的點分深度就可以了。
code:
#include
#define maxn 100005
using
namespace std;
char cb[
1<<18]
,*cs,
*ct;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<18,stdin),cs==ct)?0:*cs++)
inline
void
read
(int
&a)int n,m,dis[20]
[maxn]
,dep[maxn]
,siz[maxn]
,fa[maxn]
,ans;
bool vis[maxn]
;int fir[maxn]
,nxt[maxn<<1]
,to[maxn<<1]
,tot;
inline
void
line
(int x,
int y)
int arr[maxn*40]
,*idx=arr;
struct bit
void
ins(
int l,
int r,
int v)
intqsum
(int i)
}a[maxn]
,b[maxn]
;void
getroot
(int u,
int ff,
int tsz,
int&g)
void
dfs2
(int u,
int ff,
int&mxd,
int d)
inttdc
(int u,
int tsz,
int depth)
return u;
}void
modify
(int x,
int k,
int v)
}int
solve
(int x)
intmain()
}
BZOJ4372 爍爍的遊戲
背景 爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。題意 給定一顆n個節點的樹,邊權均為1,初始樹上沒有皮皮鼠。爍爍他每次會跳到乙個節點u,把周圍與他距離不超過d的節點各吸引出w只皮皮鼠。皮皮鼠會被爍爍吸引,所以會一直待在節點上不動。爍爍很好奇,在當前時刻,節點u有多少個他的好朋友 皮皮鼠。大意 給一顆n個...
BZOJ 4372 爍爍的遊戲
背景 爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。題意 給定一顆n個節點的樹,邊權均為1,初始樹上沒有皮皮鼠。爍爍他每次會跳到乙個節點u,把周圍與他距離不超過d的節點各吸引出w只皮皮鼠。皮皮鼠會被爍爍吸引,所以會一直待在節點上不動。爍爍很好奇,在當前時刻,節點u有多少個他的好朋友 皮皮鼠。大意 給一顆n個...
BZOJ 4372 爍爍的遊戲 動態點分治
time limit 30 sec memory limit 512 mb submit 804 solved 288 submit status discuss 背景 爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。題意 給定一顆n個節點的樹,邊權均為1,初始樹上沒有皮皮鼠。爍爍他每次會跳到乙個節點u,把周...