4034 HAOI2015 樹上操作

2021-08-03 10:14:16 字數 934 閱讀 8060

%黈力   %小貓

先用樹剖搞出dfs序,再用樹狀陣列差分維護

答案 。

對於第一種操作,子樹中的每乙個點都被加上a,直接區間加就好了。

對於第二種操作,每個點增加的值為(deep[y]-deep[x]+1)*a,對此可以分成兩部分,一部分是-(deep[x]-1)*a,同第一種操作一樣處理,另一部分是deep[y]*a,可再開乙個樹狀陣列,這個陣列對答案的貢獻需要乘上deep。

詢問時將兩個樹狀陣列的貢獻加起來就好了。

long long只開了一半,調了好幾個小時qaq。

#include#includeusing namespace std;

#define rep(i,j,k) for(i=j;i<=k;++i)

#define per(i,j,k) for(i=j;i>=k;--i)

#define ll long long

const int n=100005;

int he[n],ne[n<<1],to[n<<1],tot;

int n,m;ll w[n];

int dad[n],son[n],pre[n],sz[n],dep[n],dfn[n],cnt;

ll t1[n],t2[n];

void add(int x,int y)

void dfs1(int x)

}void dfs2(int x)

void ins(ll t,int x,ll y)

ll query(ll t,int x)

int main()

dfs1(1);dfs2(1);

rep(i,1,n)ins(t1,dfn[i],w[i]),ins(t1,dfn[i]+1,-w[i]);

while(m--)

} return 0;

}

bzoj P4034 HAOI2015 樹上操作

傳送門 這題也有更高超的方法,用線段樹維護dfs序,對於dfs序中出現的節點我們乙個取正乙個取負,就可以直接上線段樹了。樹剖 include include define ll long long using namespace std const int maxn 100005 struct no...

bzoj4034 HAOI2015 樹上操作

傳送門 description 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。input 第一行包含...

bzoj 4034 HAOI2015 樹上操作

4034 haoi2015 樹上操作 time limit 10 sec memory limit 256 mb submit 4216 solved 1340 submit status discuss description 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 ...