dtoi1980 談笑風生

2022-07-23 07:30:22 字數 1219 閱讀 3819

題意:

給一棵樹,求三元組(a,b,c)滿足a和b都是c的祖先,且b到a的距離小於等於k,a和k給定

題解:

分情況討論(以下內容的子節點數都不包括自己本身)。

如果b是a的祖先,那麼貢獻就是(a的子節點數*(k和a的祖先的最小值))。很好理解,因為b是a的祖先且距離小於等於k,所以b不能超過a的k級父親,但a不一定有k個父親,所以取最小值。每乙個b都可以取a的所有子節點。

如果b是a的兒子,那麼對於任意乙個合法的b,貢獻為它的子節點數,因為c可以在它的子節點中任選。接下來問題就變成了:求乙個節點的子節點中,到這個節點距離小於等於k的所有點的權值(即子節點數)之和。在子節點中,可以轉化為dfs序上的一段區間。距離小於等於k,可以表示成深度在(dep[a]+1)~(dep[a]+k)之中,接著可以使用可持久化線段樹維護。

#include#include

#include

#include

using

namespace

std;

int n,q,cnt,rt[300002],dep[300002],zjds[300002],dfn[300002],df,t[300002

];vector

g[300002

];typedef

struct

p;p p[

10000002

];void dfs(int x,inty)}

void gengxin(int r1,int r2,int begin,int end,int wz,int

z)

int mid=(begin+end)/2

;

if (wz<=mid)

else

p[r2].sum=p[p[r2].ls].sum+p[p[r2].rs].sum;

}long

long chaxun(int root,int begin,int end,int begin2,int

end2)

intmain()

dfs(

1,0);

for (int i=1;i<=n;i++)

for (int i=1;i<=q;i++)

return0;

}

3653 談笑風生

time limit 20 sec memory limit 512 mb submit 498 solved 185 submit status discuss 設t 為一棵有根樹,我們做如下的定義 設a和b為t 中的兩個不同節點。如果a是b的祖先,那麼稱 a比b不知道 高明到 去了 設a 和 b...

湖南集訓 談笑風生

嘟嘟嘟 這題剛開始猶豫了一會兒,以為 高明 的優先順序大於 談笑風生 不過樣例表明只要兩點間距離不超過 x 兩人就算 談笑風生 接下來看看怎麼回答詢問。首先 a 是固定的,且 a,b 都是 c 的祖先。那就得分類討論 1.b 是 a 的祖先,那麼 c 就是 a 的子樹中的所有點,根據乘法原理,三元組...

BZOJ3653 談笑風生

對於每乙個詢問我們可以提出 ans min dep u 1,k size u 1 u子樹中到u距離 k的節點的子樹節點和 顯然後面那個東西是可以用可持久化線段樹搞得 好了 include include include include using namespace std char c defin...