背景:爍爍很喜歡爬樹,這嚇壞了樹上的皮皮鼠。
題意:給定一顆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節點的皮皮鼠數量。
7 61 2
1 41 5
2 32 7
5 6m 1 1 2
q 5m 2 2 3
q 3m 1 2 1
q 2236
資料範圍:
\(n,m<=10^5,|w|<=10^4\)
注意:w不一定為正整數,因為爍爍可能把皮皮鼠嚇傻了。
首先我們就發現操作是把距離到乙個點不超過k的點權值加上乙個w,然後查詢乙個點的權值
首先我們就發現對於每個點可以算出來距離小於等於k的點被加上了多少
然後查詢的時候我們就只需要看每個節點和查詢節點的距離在那個節點上被新增了多少次就可以了
這個過程是可以用動態點分治來優化的
可以用尤拉序處理掉lca,然後因為每次我們都是區間加,但點查詢,所以就可以用樹狀陣列來維護了
但是注意樹狀陣列的大小需要動態控制
注意下細節就可以了
#includeusing namespace std;
int read()
const int n = 1e5 + 10;
const int log = 20;
struct edge
} e[n << 1];
int head[n], tot = 0;
int n, q;
char c[10];
void addedge(int u, int v)
namespace lca
bool operator < (const node b) const
} st[n << 1][log];
int first[n], dep[n], log[n << 1], len;
void dfs(int u, int fa)
}void init()
}}int getdis(int u, int v)
}namespace tree_devide
} void modify(int l, int r, int vl, int typ, int u)
int query(int x, int typ, int u)
return res;
}void getsiz(int u, int fa)
}void getroot(int u, int fa)
f[u] = max(f[u], siz_all - siz[u]);
if (f[u] < f[rt]) rt = u;
}void solve(int u, int fa)
}void init()
void modify_tree(int u, int k, int num)
}}int query_tree(int u)
return res;}}
int main()
lca::init();
tree_devide::init();
while (q--) else
} return 0;
}
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,把周...