bzoj4034 樹上操作

2022-06-07 22:27:09 字數 1227 閱讀 8053

dfs序(注意出棧時也要加入),然後對於每一次乙個節點的修改,都在左端點上打

+x,右端點上打

-x,區間修改同理(因此要用線段樹且需要維護區間左端點數量

-右端點數量)。對於詢問操作,就是

dfs序上的一段字首和,用線段樹處理即可。

1 #include2 #include3

#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 }

view code

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 第一行包含...