對於每乙個詢問我們可以提出
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...