牛客 樹上路徑(樹鏈)

2021-08-27 18:24:58 字數 2040 閱讀 8441

思路: 對於前兩個操作就是最基本操作,那麼問題就在於第三個操作,可以發現第三個操作就是求a1*(a2+a3+...+ an-1+an)+ a2*(a3+ a4+...+ an) +a3*( a4+...+an) +...+an-1*an;

那麼轉化一下就是[(a1+a2+a3+...+an)*(a1+a2+a3+...+an)-(a1*a1+a2*a2+...+an*an) ]/2;

那麼就維護  sum  和 二次方sum就可以了。

**:

#include#define lson (i<<1)

#define rson (i<<1|1)

using namespace std;

typedef long long ll;

const int n =1e5+5;

const ll mod=1e9+7;

const ll inv2=500000004;

struct eee

edge[n*2];

int tot,head[n];

struct node

tr[n<<2];

int fat[n]; /// 當前節點的直接父親

int dep[n]; /// 當前節點的在樹上深度

int siz[n]; /// 當前節點的孩子個數

int son[n]; /// 當前節點的重孩子

int rak[n]; /// 線段樹的第i個節點是?

int top[n]; /// 當前節點的鏈開始節點 top

int cnt;

int n,m;

ll a[n];

void init()

void add(int u,int v)

void dfs1(int u,int fa,int deep)

}}void dfs2(int u,int t)

}}void push_up(int i)

void build(int i,int l,int r)

void solve(int i,ll val)

void push_down(int i)

}void update(int i,int l,int r,ll val)

push_down(i);

int mid=(tr[i].l+tr[i].r)>>1;

if(r<=mid) update(lson,l,r,val);

else if(l>mid) update(rson,l,r,val);

else

push_up(i);

}void query(int i,int l,int r,ll &sum1,ll &sum2)

push_down(i);

int mid=(tr[i].l+tr[i].r)>>1;

if(r<=mid) return query(lson,l,r,sum1,sum2);

else if(l>mid) return query(rson,l,r,sum1,sum2);

else

}ll querys(int x,int y)

else

}if(idd[x]<=idd[y])

else

ll ans=(sum1*sum1%mod-sum2+mod)*inv2%mod;

return ans;

}void updates(int x,int y,ll c)

else

fx=top[x];

fy=top[y];

}if(idd[x]<=idd[y]) update(1,idd[x],idd[y],c);

else update(1,idd[y],idd[x],c);

}int main()

dfs1(1,1,0);

dfs2(1,1);

build(1,1,n);

int op;

ll val;

while(m--)

else if(op==2)

else

}return 0;

}

5055 樹上路徑

給定一顆 n 個結點的無根樹,每個點有乙個點權,定義一條路徑的價值為路徑上的點權和 路徑的點權最大值。給定引數 p,求有多少不同的樹上簡單路徑,滿足它的價值恰好是 p 的倍數。data constraint n 105,p 107 考慮點分治。對於當前的分治重心,把所有以它為起點的路徑取出來,按照路...

題解 樹上路徑

一棵樹的構造過程為 首先以1號點為根,然後依次加入2 n號點。加入i號點時,在1 i 1點中選擇乙個點為f i 將i號點與其相連線。yuri想要求出,每次加點之後路上的最長路徑長度。第一行乙個整數n,表示樹的節點個數。第二行n 1個整數,第i個整數表示f i 1 一行n 1個整數,分別表示加完2 n...

樹上路徑(path)

在 berland,有n 個城堡。每個城堡恰好屬於乙個領主。不同的城堡屬於不同的領主。在所有領主中有乙個是國王,其他的每個領主都直接隸屬於另一位領主,並且間接隸屬於國王。一位領主可以擁有任意數量的下屬。這些城堡被一些雙向的道路連線。兩個城堡是連線的當且僅當他們的主人中一位直接隸屬於另一位。每一年,在...