華華和月月種樹(牛客)

2021-10-23 13:39:40 字數 2693 閱讀 5819

題意:

華華看書了解到,一起玩養成類的遊戲有助於兩人培養感情。所以他決定和月月一起種一棵樹。因為華華現在也是資訊學高手了,所以他們種的樹是資訊學意義下的。

華華和月月一起維護了一棵動態有根樹,每個點有乙個權值。剛開存檔的時候,樹上只有 0 號節點,權值為 0 。接下來有兩種操作:

操作 1:輸入格式1 i,表示月月氪金使節點 i 長出了乙個新的兒子節點,權值為0,編號為當前最大編號 +1(也可以理解為,當前是第幾個操作 1,新節點的編號就是多少)。

操作 2:輸入格式 2 i a表示華華上線做任務使節點 i 的子樹中所有節點(即它和它的所有子孫節點)權值加 a 。

但是月月有時會檢查華華有沒有認真維護這棵樹,會作出詢問:

詢問 3:輸入格式3 i,華華需要給出 i 節點此時的權值。

華華當然有認真種樹了,不過還是希望能寫個程式以備不時之需。

題解:

dfs序+線段樹

這個題的難點就是他會有乙個動態增點的過程。

這樣的話呢,如果你直接把這個點建立起來不去,那會出現問題的。

比如說根節點1連著2 3兩個兒子 但是3兒子是最後建立的,所以你對結點1做2操作時,會把節點三的值也給加上去,這就是本題的難點。

所以為了處理這個問題,你在每次在加入乙個新結點時,把當前結點的值給更新為0才對,這裡你可以先把那個結點的值給查出來是多少,然後再用更新函式把那個結點的值減去查出來的值即可,(這樣做的好處就是可以少寫乙個update函式),壞處是稍微浪費一點時間。

/*keep on going never give up*/

#pragma gcc optimize(3,"ofast","inline")

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#define int long long

#define endl '\n'

using

namespace std;

const

int maxn =

2e6+10;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const ll mod=

1e9+7;

using

namespace std;

vector<

int>edge[

400010];

int sum[maxn]

,lazy[maxn]

;int a[maxn]

,b[maxn]

,cnt;

int in[maxn]

,out[maxn]

;int tot,op[maxn]

;void

dfs(

int u)

out[u]

=tot;

}void

pushdown

(int l,

int r,

int rt)

}void

update

(int l,

int r,

int c,

int l,

int r,

int rt)

pushdown

(l,r,rt)

;int m=

(l+r)

>>1;

if(l<=m)

update

(l,r,c,l,m,rt<<1)

;if(r>m)

update

(l,r,c,m+

1,r,rt<<1|

1);}

intquery

(int p,

int l,

int r,

int rt)

pushdown

(l,r,rt)

;int m=

(l+r)

>>1;

if(p<=m)

return

query

(p,l,m,rt<<1)

;else

return

query

(p,m+

1,r,rt<<1|

1);}

intmain()

else

if(op[i]==2

) cin>>b[i];}

dfs(1)

;for

(int i=

1;i<=n;i ++

)else

if(op[i]==1

)else

}return0;

}

華華和月月種樹

時間限制 c c 2秒,其他語言4秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 華華看書了解到,一起玩養成類的遊戲有助於兩人培養感情。所以他決定和月月一起種一棵樹。因為華華現在也是資訊學高手了,所以他們種的樹是資訊學意義下的。華華和月月一起維護...

牛客 華華聽月月唱歌 貪心

第一行兩個正整數n m,表示歌曲的原長和片段的個數。接下來m行,每行兩個正整數l r表示第i的片段對應的區間是 l,r 如果可以做到,輸出最少需要的片段的數量,否則輸出 1。示例1 複製4 2 1 23 4複製 2示例2 複製4 2 1 13 4複製 1示例3 複製10 5 1 12 5 3 64 ...

華華和月月種樹(dfs序 樹狀陣列)

對一棵樹 初始只有 0 號節點,權值為 0 進行操作和詢問 操作 1 輸入格式1 i,表示使節點 i 長出了乙個新的兒子節點,權值為0,編號為當前最大編號 1 也可以理解為,當前是第幾個操作 1,新節點的編號就是多少 操作 2 輸入格式 2 i a,表示華華上線做任務使節點 i 的子樹中所有節點 即...