BZOJ3653 談笑風生

2021-07-10 05:44:07 字數 864 閱讀 4837

對於每乙個詢問我們可以提出

ans=min(dep[u]-1,k)*(size[u]-1)+u子樹中到u距離<=k的節點的子樹節點和

顯然後面那個東西是可以用可持久化線段樹搞得

好了

#include

#include

#include

#include

using namespace std;

char c;

#define ll long long

inline void read(ll &a)

struct chain

}*head[300001];

struct seg

};int tot;

inline void addside(ll a,ll b)

ll size[300001],h[300001];

seg*start[300001],*end[300001];

ll maxh;

void dfs(ll u,ll f)

}seg*build(ll l,ll r)

seg*modify(seg*old,ll place,ll data)

seg*ne=new seg;

*ne=*old;

ne->data+=data;

return

ne; }

ll query(seg*old,seg*now,ll l,ll r)

seg* build(seg* a,ll u,ll f)

return end[u];

}inline ll query(ll a,ll k)

int main()

}

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

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