題意:
華華看書了解到,一起玩養成類的遊戲有助於兩人培養感情。所以他決定和月月一起種一棵樹。因為華華現在也是資訊學高手了,所以他們種的樹是資訊學意義下的。
華華和月月一起維護了一棵動態有根樹,每個點有乙個權值。剛開存檔的時候,樹上只有 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 的子樹中所有節點 即...