BZOJ 4372 爍爍的遊戲 動態點分治

2021-08-22 17:55:54 字數 1334 閱讀 6159

time limit: 30 sec  memory limit: 512 mb

submit: 804  solved: 288

[submit][status][discuss]

背景:爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。

題意:給定一顆n個節點的樹,邊權均為1,初始樹上沒有皮皮鼠。

爍爍他每次會跳到乙個節點u,把周圍與他距離不超過d的節點各吸引出w只皮皮鼠。皮皮鼠會被爍爍吸引,所以會一直待在節點上不動。

爍爍很好奇,在當前時刻,節點u有多少個他的好朋友---皮皮鼠。

大意:給一顆n個節點的樹,邊權均為1,初始點權均為0,m次操作:

q x:詢問x的點權。

m x d w:將樹上與節點x距離不超過d的節點的點權均加上w。

第一行兩個正整數:n,m

接下來的n-1行,每行三個正整數u,v,代表u,v之間有一條邊。

接下來的m行,每行給出上述兩種操作中的一種。

對於每個q操作,輸出當前x節點的皮皮鼠數量。

思路:

和震波那題差不多,按照分治結構建一棵樹,

然後開兩個動態線段樹來維護。

**:#includeusing namespace std;

#define cherry main

const int maxn=1e5+10;

const int len=1e5;

int n,m;

struct node

tree1[maxn*210],tree2[maxn*210];

vectorg[maxn];

int f[maxn][20],dist[maxn][20],dep[maxn],c1[maxn],c2[maxn];

int root,now_size,son[maxn],t1[maxn],t2[maxn],tol1,tol2;

bool vis[maxn];

void get_root(int v,int fa,int size)

}int sum1(int l,int r,int l,int r,int rt)

int sum2(int l,int r,int l,int r,int rt)

int query(int x)

return ans;

}int cherry()

get_root(root=1,0,now_size=n);

build(root,0);

for(int i=1;i<=n;i++) f[i][dep[i]+1]=i;

while(m--)

else

}return 0;

}

BZOJ4372 爍爍的遊戲

背景 爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。題意 給定一顆n個節點的樹,邊權均為1,初始樹上沒有皮皮鼠。爍爍他每次會跳到乙個節點u,把周圍與他距離不超過d的節點各吸引出w只皮皮鼠。皮皮鼠會被爍爍吸引,所以會一直待在節點上不動。爍爍很好奇,在當前時刻,節點u有多少個他的好朋友 皮皮鼠。大意 給一顆n個...

BZOJ 4372 爍爍的遊戲

背景 爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。題意 給定一顆n個節點的樹,邊權均為1,初始樹上沒有皮皮鼠。爍爍他每次會跳到乙個節點u,把周圍與他距離不超過d的節點各吸引出w只皮皮鼠。皮皮鼠會被爍爍吸引,所以會一直待在節點上不動。爍爍很好奇,在當前時刻,節點u有多少個他的好朋友 皮皮鼠。大意 給一顆n個...

BZOJ4372 爍爍的遊戲 動態點分治

題目描述 給一顆n個節點的樹,邊權均為1,初始點權均為0,m次操作 q x 詢問x的點權。m x d w 將樹上與節點x距離不超過d的節點的點權均加上w。n,m 105,w 104 題目分析 每個點分中心維護乙個樹狀陣列記錄對子樹某個距離的加權,再維護乙個記錄點分樹上的父親由自己這棵子樹貢獻上去的加...