Bzoj3653 談笑風生

2022-05-13 15:13:15 字數 2216 閱讀 5712

time limit: 20 sec  memory limit: 512 mb

submit: 753  solved: 295

設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)滿足:

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

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

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

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

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

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

5 31 2

1 32 4

4 52 2

4 12 331

31<=p<=n

1<=k<=n

n<=300000

q<=300000

dfs序+可持久化線段樹

相比前一道大新聞和後一道圖樣圖森破來說,這題簡直太特麼友好了……但是膜多了果然有危害,昨天打cf的時候後台開著這題,把分數都續走了……(明明是自己蒻)

圖樣圖森破正解是字尾陣列lcp+st表什麼的,理論ac,試著用字尾自動機寫然而傻傻寫不出,棄坑。

b可能是a的祖先也可能是a的子樹。前者只需要dep[a]*(size[a]-1)得到答案,後者有些麻煩:對於每乙個(a,b)對,答案等於b的子樹size,。

剛開始的想法是用dfs序+樹狀陣列統計,敲完dfs序以後開始懵逼,不會用樹狀陣列統計答案……然後想到可持久化線段樹。把dfs序作為時間軸,結點深度作為座標,可以方便地統計出乙個結點的所有子結點的size和,也就是後半部分答案。

1 #include2 #include3 #include4 #include5 #include6

#define ll long long

7using

namespace

std;

8const

int mxn=300110;9

intread()

12while(ch>='

0' && ch<='9')

13return x*f;14}

15struct edgee[mxn<<1

];16

int hd[mxn],mct=0;17

void add_edge(int u,int

v)20

intdep[mxn],sz[mxn];

21//

22int

in[mxn],out

[mxn];

23int id[mxn],cnt=0;24

intn,q;

25struct

nodet[mxn*20

];28

int rt[mxn],tct=0;29

int mx=0;30

void dfs(int u,int

fa)42

out[u]=cnt;43}

44void update(int p,int v,int l,int r,int x,int &rt)

54 ll query(int l,int r,int l,int r,int

rt)57

int mid=(l+r)>>1

;58 ll res=0;59

if(l<=mid)res+=query(l,r,l,mid,t[rt].l);

60if(r>mid)res+=query(l,r,mid+1

,r,t[rt].r);

61return

res;62}

63int

main()

71 dfs(1,0

);72

for(i=1;i<=cnt;i++)

75while(q--)

82return0;

83 }

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。...