【題目描述】
在一片土地上有 $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 #include2view code#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 }
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把點分樹建出來,然後對每個分治中心用樹狀陣列維護到該點距離為定值的點權和,以及到他點分樹上父親距離為定值的點權和。查詢的時候每次沿著父親往上跳,在計算當前點貢獻時需要減去上乙個點所在子樹的貢...