震波 動態點分治 線段樹

2022-09-01 10:36:14 字數 2180 閱讀 2028

【題目描述】

在一片土地上有 $n$ 個城市,通過 $n-1$ 條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為 $1$,其中第 $i$ 個城市的價值為 $value[i]$。

不幸的是,這片土地常常發生**,並且隨著時代的發展,城市的價值也往往會發生變動。

【輸入格式】

第一行包含兩個正整數 $n$ 和 $m$ 。

第二行包含 $n$ 個正整數,第 $i$ 個數表示 $value[i]$ 。

接下來 $n-1$ 行,每行包含兩個正整數$u,v$,表示 $u$ 和 $v$ 之間有一條無向邊。

接下來 $m$ 行,每行包含三個數,表示 $m$ 次操作。

【輸出格式】

包含若干行,對於每個詢問輸出一行乙個正整數表示答案。

【樣例輸入】

8 11 10 100 1000 10000 100000 1000000 10000000

1 21 3

2 42 5

3 63 7

3 80 3 1

【樣例輸出】

11100101

【資料範圍與提示】

$1 \le n,m \le 100000$

$1 \le u,v,x \le n $

$1 \le value[i],y \le 10000 $

$ 0 \le k \le n-1 $

要求樹上和乙個點距離不超過 $k$ 的所有點,很容易想到動態點分治

開 $ n $ 棵權值線段樹,記錄當前點分中心距離為 $ v $ 的點的個數

考慮在點分樹上查詢,會發現在 $ x $ 統計過答案的點有可能在 $ fa[x] $ 上也被統計

考慮容斥,再開 $ n $ 棵線段樹,記錄從當前點分中心 $ x $ 經過 $ fa[x] $ 距離為 $ v $ 的權值和,查詢時扣掉即可

時間效率:$ o(nlog^2 n) $

1 #include2

#define ll long long

3#define il inline

4#define re register

5#define _(d) while(d(isdigit(ch=getchar())))

6using

namespace

std;

7 il int

r()10

const

int n=2e5+10;11

int n,m,ans,f[n],top[n],dep[n],sz[n],son[n],head[n],cnt,mx,rt,sz,fa[n],siz[n],val[n],rot[n<<1

],tot;

12bool

vis[n];

13struct segtr[n<<6

];14

struct edgee[n<<1

];15 il void add(int s,int t),head[s]=cnt;}

16 il void dfs(int x,int

far)

23return;24

}25 il void dfs(int x,int

far)

32 il int lca(int x,int

y)37

return dep[x]x:y;38}

39 il int

get(int u,int v)

40 il void getrot(int u,int

far)

49 il int getsize(int u,int

far)

56void slove(int u,int

far)

62#define ls tr[rt].ls

63#define rs tr[rt].rs

64 il void change(int &rt,int l,int r,int k,int

x)73 il int query(int rt,int l,int r,int

qr)81 il void update(int x,int

v)88

}89 il int ask(int x,int

y)96

return

res;97}

98int

main()

110return0;

111 }

view code

BZOJ3730 震波 動態點分治

include include include include include include define space putchar define enter putchar n using namespace std typedef long long ll template void rea...

BZOJ3730 震波 動態點分治

在一片土地上有n個城市,通過n 1條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為1,其中第i個城市的價值為value i 不幸的是,這片土地常常發生 並且隨著時代的發展,城市的價值也往往會發生變動。0 x k 表示發生了一次 震中城市為x,影響範圍為k,所有與x距離不超過k的城市都將受到影...

bzoj 3730 震波 動態樹分治

給出一棵樹,點有點權,每次詢問距離乙個點不超過k kk 100000 n le100000 n 1000 00把點分樹建出來,然後對每個分治中心用樹狀陣列維護到該點距離為定值的點權和,以及到他點分樹上父親距離為定值的點權和。查詢的時候每次沿著父親往上跳,在計算當前點貢獻時需要減去上乙個點所在子樹的貢...