%黈力 %小貓
先用樹剖搞出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 個 ...