題意:
給一棵樹,求三元組(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...