時間限制: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推薦好友,似乎華華還沒有瀏覽過。月月頓時醋意大發,出於對好朋友的關心,為了避免華華浪費太多時間和其他聊天,她要刪掉一些推薦好友。但是為了不讓華華發現,產生猜疑...