BZOJ4372 爍爍的遊戲 動態點分治

2021-10-03 11:37:02 字數 1451 閱讀 4676

題目描述:

給一顆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,把周...