BZOJ3653 談笑風生

2021-07-12 04:18:10 字數 729 閱讀 1082

題目大意:給一棵樹,每次詢問給定a,k,求三元組(a,b,c)的數量滿足:

1.a和b都是c的祖先

2.a和b在樹上距離不超過k

3.a,b,c互不相同

顯然abc肯定形成豎著的一條鏈

分兩種情況討論:1.b在a的上方,也就是說對於任意合法的b,c可以在a的子樹裡隨便選,這個方案數是可以直接算出來的

2.b在a下方,這種情況對於不同的b,c只能在b的子樹當中選,也就是說此時的方案數總和=∑(siz(b)-1)(deep[b]-deep[a]<=k)

那我們不妨建立乙個二維平面,對於樹上的每個節點,橫座標為他的dfs序,縱座標為他的deep值,點權是siz-1

然後問題就變成了求矩形內所有點的和了

#include#include#include#include#define n 300010

using namespace std;

long long to[n<<1],nxt[n<<1],pre[n],cnt;

void ae(long long ff,long long tt)

long long fa[n],d[n],siz[n],sit[n],cn;

void build(long long x)

}struct pppb[n*10];

long long ans[n];

bool cmp(ppp x,ppp y)

{ if(x.y!=y.y) return x.y

BZOJ3653 談笑風生

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

BZOJ 3653 談笑風生

題目在這裡呀!個人認為是一道很好的題目,原來可持久化線段樹還能這麼用,看題解之前還是沒有想到啦要批評!那就寫個題解補償一下?給你一棵有根樹,n個節點,有q次詢問,每次詢問,給出兩個數x 1 x n d,求有多少有序元組 y,z 滿足 x,y,z互不相同,x,y均為z的祖先,且x,y之間的距離超過d。...

BZOJ3653 談笑風生

設d x 表示x到根的距離 size x 表示x的子樹大小 不含自己 求出dfs序後按dfs序建主席樹,線段樹中區間 a,b 表示深度在 a,b 範圍內的size的和 查詢x,y的答案 size x min d x y dfs序在st x 1到en x 之間且深度在d x 1到d x k之間的siz...