設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之間的size的和
時間複雜度$o((n+q)\log n)$
#include#define n 300010
#define m 5700000
typedef long long ll;
int n,q,i,x,y,f[n],g[n],nxt[n<<1],v[n<<1],ed,size[n],d[n],st[n],en[n],dfn,seq[n],d,l[m],r[m],tot,root[n];ll val[m];
inline void read(int&a)
inline void add(int x,int y)
void dfs(int x)
int ins(int x,int a,int b,int c,int d)
ll ask(int x,int a,int b,int c,int d)
int main()
BZOJ3653 談笑風生
對於每乙個詢問我們可以提出 ans min dep u 1,k size u 1 u子樹中到u距離 k的節點的子樹節點和 顯然後面那個東西是可以用可持久化線段樹搞得 好了 include include include include using namespace std char c defin...
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。...