dfs序(注意出棧時也要加入),然後對於每一次乙個節點的修改,都在左端點上打
+x,右端點上打
-x,區間修改同理(因此要用線段樹且需要維護區間左端點數量
-右端點數量)。對於詢問操作,就是
dfs序上的一段字首和,用線段樹處理即可。
1 #include2 #include3view code#define ll long long
4#define maxn 100001
5#define l (k<<1)
6#define r ((k<<1)+1)
7#define mid ((l+r)>>1)
8struct
jiedge[maxn<<1
];11
struct
nodef[maxn<<4
];14
ll e,n,m,x,y,a[maxn],head[maxn],l[maxn],r[maxn];
15bool vis[maxn<<1
];16
void
init()
20void add(int x,int
y)25
void up(int
k)28
void down(int
k)35
void update(int k,int l,int r,int x,int y,int
z)45
update(l,l,mid,x,y,z);
46 update(r,mid+1
,r,x,y,z);
47up(k);48}
49 ll query(int k,int l,int r,int x,int
y)55
void dfs(int k,int
f)61
intmain()
71 x=0
;72 dfs(1,0
);73
for(int i=1;i<=n;i++)
77 n*=2;78
for(int i=1;i<=m;i++)
85if (p==2)update(1,1
,n,l[x],r[x],y);
86if (p==3)printf("
%lld\n
",query(1,1,n,1
,l[x]));87}
88 }
bzoj4034 樹上操作
有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。第一行包含兩個整數 n,m 表示點數和運算元。接下來一...
題解 bzoj4034 樹上操作
有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。第一行包含兩個整數 n,m 表示點數和運算元。接下來一...
bzoj4034 HAOI2015 樹上操作
傳送門 description 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。input 第一行包含...