洛谷P3899 湖南集訓 談笑風生

2021-10-09 02:25:17 字數 2177 閱讀 1035

設t 為一棵有根樹,我們做如下的定義:

• 設a和b為t 中的兩個不同節點。如果a是b的祖先,那麼稱「a比b不知道

高明到**去了」。

• 設a 和 b 為 t 中的兩個不同節點。如果 a 與 b 在樹上的距離不超過某個給定

常數x,那麼稱「a 與b 談笑風生」。

給定一棵n個節點的有根樹t,節點的編號為1 到 n,根節點為1號節點。你需

要回答q 個詢問,詢問給定兩個整數p和k,問有多少個有序三元組(a;b;c)滿足:

a、b和 c為 t 中三個不同的點,且 a為p 號節點;

a和b 都比 c不知道高明到**去了;

a和b 談笑風生。這裡談笑風生中的常數為給定的 k。

輸入檔案的第一行含有兩個正整數n和q,分別代表有根樹的點數與詢問的個數。接下來n – 1行,每行描述一條樹上的邊。每行含有兩個整數u和v,代表在節點u和v之間有一條邊。

接下來q行,每行描述乙個操作。第i行含有兩個整數,分別表示第i個詢問的p和k。

輸出 q 行,每行對應乙個詢問,代表詢問的答案。

線段樹合併。

對於要求2明顯就是找a的子樹。

對於要求3:

b為a父親 明顯ans=siz[a]*min(k,dep[a])

b為a兒子 方案數就是深度在depth[a]+1到depth[a]+k之間每個b的(size[b]-1)之和,那麼可以用線段樹合併來做,線段樹下標表示深度,記區間的(size-1)之和,求線段樹在(depth[a]+1,depth[a]+k)的區間和。

每個點開一棵線段樹 l和r表示深度範圍 父親合併兒子以更新

計算答案時記得要新開節點。

#include

using

namespace std;

int n,q;

struct nodetree[

300010*20

];int tot=0;

inline

voidup(

int x)

void

add(

int x,

int tl,

int tr,

int w,

int ad)

int mid=

(tl+tr)/2

;if(w<=mid)

if(w>mid)

up(x);}

long

long

asks

(int x,

int tl,

int tr,

int l,

int r)

intmerge

(int x,

int y,

int tl,

int tr)

int mid=

(tl+tr)/2

,now=

++tot;

tree[now]

.ls=

merge

(tree[x]

.ls,tree[y]

.ls,tl,mid)

; tree[now]

.rs=

merge

(tree[x]

.rs,tree[y]

.rs,mid+

1,tr);up

(now)

;return now;

}vector<

int>po[

300010];

int fa[

300010

],h[

300010

],siz[

300010

],rtw[

300010];

void

dfs(

int u)

rtw[u]

=++tot;

add(rtw[u],1

,n,h[u]

,siz[u]-1

);for(

int j=

0;j<

(int

)po[u]

.size()

;j++)}

intmain()

h[1]=

1;dfs(1)

;int k;

for(

int z=

1;z<=q;z++

)return0;

}

洛谷 P3899 湖南集訓 談笑風生

原題鏈結 題目大意 有一棵 n nn 個節點的有根樹,有 m mm 組詢問 每次詢問給出 a,k a,ka,k,求有多少個三元組 a,b,c a,b,c a,b,c 滿足 a,b a,ba,b 都是 c cc 的祖先,並且 a,b a,ba,b 之間的距離不超過 kkk 剛開始沒有思路,看了題解的分...

P3899 湖南集訓 談笑風生

傳送門 首先 a,b,c 肯定在一條鏈上。當 b 為 a 的祖先時,a 的子樹中所有與它不同的點都可以作為點 c 當 a 為 b 的祖先時,b 的子樹中所有與它不同的點都可以作為答案 我會說我以前根本沒寫過線段樹合併結果完全不知道錯在 麼 luogu judger enable o2 minamot...

P3899 湖南集訓 談笑風生

題目大意 n個節點的樹,q次查詢,每次查詢給出a,k求三元組的數量 a,b,c a,b,c 的定義為 a b均為c的祖先且距離 k 離線,啟發式合併線段樹,長鏈剖分當然都能過這題 這裡講講主席樹的做法 dfs序建樹 a為b的祖先時 查詢a子樹內深度 dep a k的節點的子樹和 b為a祖先時 乘法原...