華華和月月種樹

2021-10-23 13:45:50 字數 1692 閱讀 2145

時間限制:c/c++ 2秒,其他語言4秒

空間限制:c/c++ 131072k,其他語言262144k

64bit io format: %lld

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

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

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

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

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

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

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

第一行乙個正整數m,接下來m行,每行先輸入乙個正整數o表示操作型別,再輸入乙個非負整數i表示操作或詢問的節點編號,如果o=2,再輸入乙個正整數a。
對於每個詢問3,輸出乙個非負整數表示詢問的答案。
示例1

9

1 02 0 1

3 03 1

1 01 1

2 0 2

3 13 3

113

2

1≤m≤4×1051\le m\le 4\times 10^51≤m≤4×105,保證操作1的數量不超過10510^5105,保證操作2中的引數a滿足1≤a≤9991\le a\le 9991≤a≤999
預處理:將輸入建成樹後前序遍歷,使每個節點及其子樹的序號連續,

樹狀陣列:節點+子樹的大小就是這個節點最後的根節點的位置。

新建邊:將這個節點值變為0,再將其子樹更新(減去這個節點的值)

更新節點:正常的樹狀陣列更新,更新範圍是該節點位置到該節點最後根節點位置

輸出節點值:輸出該節點值

#include#include#includeusing namespace std;

const int n = 4e5 + 10;

struct nodenod[n];

int idx, h[n], e[n], ne[n];

void add(int a, int b)

int cnt;

int tim;

int order[n];

int size[n];

void dfs(int u)

}int lowbit(int x)

int tree[n];

void add_tree(int a, int b, int v)//樹狀陣列更新

int query(int x)

int main()

dfs(0);//前序遍歷

cnt = 0;

for(int i=0; ielse if(nod[i].op == 2)

else

}return 0;

}

華華和月月種樹(牛客)

題意 華華看書了解到,一起玩養成類的遊戲有助於兩人培養感情。所以他決定和月月一起種一棵樹。因為華華現在也是資訊學高手了,所以他們種的樹是資訊學意義下的。華華和月月一起維護了一棵動態有根樹,每個點有乙個權值。剛開存檔的時候,樹上只有 0 號節點,權值為 0 接下來有兩種操作 操作 1 輸入格式1 i,...

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

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

月月查華華的手機

序列自動機 月月和華華一起去吃飯了。期間華華有事出去了一會兒,沒有帶手機。月月出於人類最單純的好奇心,開啟了華華的手機。哇,她看到了一片的qq推薦好友,似乎華華還沒有瀏覽過。月月頓時醋意大發,出於對好朋友的關心,為了避免華華浪費太多時間和其他聊天,她要刪掉一些推薦好友。但是為了不讓華華發現,產生猜疑...