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 題目分析 每個點分中心維護乙個樹狀陣列記錄對子樹某個距離的加權,再維護乙個記錄點分樹上的父親由自己這棵子樹貢獻上去的加...