給定一棵 n 個點的有根樹,另有 q 次詢問,每次詢問給定
a、k,求有多少個點對 (b, c) 滿足 a、b、c 兩兩不同,a、b 都是
c 的祖先且 a、b 間距離不超過 k。 n, q ≤ 3 × 10^5。
有兩種情況。當 b 是 a 的祖先時,b 在 a 的 1 至 k 級祖先
中任選,c 在 a 的子樹內任選。
當 b 在 a 子樹內時,要求 depb ≤ depa + k,c 在 b 的子樹
內任選。可以用主席樹(或線段樹合併)維護 a 子樹內、dep 在
某個區間限制內的 size 和。
#include
#include
#define maxn 300003
#define maxm 300003*30
#define ll long long
using
namespace std;
int head[maxn]
,nxt[maxn*2]
,vv[maxn*2]
,tot;
inline
void
add_edge
(int u,
int v)
int cnt;
ll tre[maxm*2]
;int sl[maxm*2]
,sr[maxm*2]
;void
change
(int
&x,int l,
int r,
int pos,
int val)
ll query
(int x,
int l,
int r,
int ql,
int qr)
intmerge
(int a,
int b,
int l,
int r)
int n,q;
int sz[maxn]
,rot[maxn]
,dep[maxn]
;void
dfs(
int u,
int fa)
change
(rot[u],1
, n, dep[u]
, sz[u]-1
);rot[fa]
=merge
(rot[fa]
, rot[u],1
, n);}
intmain()
dfs(1,
0);while
(q--
)return0;
}
BZOJ3653 談笑風生
對於每乙個詢問我們可以提出 ans min dep u 1,k size u 1 u子樹中到u距離 k的節點的子樹節點和 顯然後面那個東西是可以用可持久化線段樹搞得 好了 include include include include using namespace std char c defin...
BZOJ3653 談笑風生
題目大意 給一棵樹,每次詢問給定a,k,求三元組 a,b,c 的數量滿足 1.a和b都是c的祖先 2.a和b在樹上距離不超過k 3.a,b,c互不相同 顯然abc肯定形成豎著的一條鏈 分兩種情況討論 1.b在a的上方,也就是說對於任意合法的b,c可以在a的子樹裡隨便選,這個方案數是可以直接算出來的 ...
BZOJ 3653 談笑風生
題目在這裡呀!個人認為是一道很好的題目,原來可持久化線段樹還能這麼用,看題解之前還是沒有想到啦要批評!那就寫個題解補償一下?給你一棵有根樹,n個節點,有q次詢問,每次詢問,給出兩個數x 1 x n d,求有多少有序元組 y,z 滿足 x,y,z互不相同,x,y均為z的祖先,且x,y之間的距離超過d。...