實驗任務
可憐的 bibi 丟了好幾臺手機以後,看誰都像是小偷,他已經在小本本上記下了他認為的各個地點的小偷數量。 現在我們將bibi的家附近的地形抽象成一棵有根樹。每個地點都是樹上的 乙個節點,節點上都標註了 bibi 心中該地點的小偷數量。現在 bibi 告訴你乙個 節點 k,請你求出以該節點為根的子樹中小偷數量的總和,以及子樹中小偷最多 的節點的小偷數量。
★資料輸入
輸入第一行為乙個正整數 n(1≤n≤100000)表示樹的節點數目,樹根的編號 總是為 1,且沒有小偷。 接下來 n-1 行,每行兩個正整數 p,x(1≤x≤100)。代表編號為 i 的節點的父 親節點 p 和該節點的小偷數量 x。資料保證輸入的 p 小於當前的 i。這裡的 i 從 2 依次數到 n。 第 n+1 行乙個整數 m(1≤m≤n), 表示詢問組數。 第 n+2 行有 m 個整數,每個整數 ki(1≤ki≤n)代表該組詢問中的節點 k。
★資料輸出
輸出 m 行,每行兩個整數,代表以詢問節點為根的子樹中小偷數量的總和, 以及子樹中小偷最多的節點的小偷數量。
測試樣例:
輸入:3
1 56
1 8211
輸出:138 82
解題過程:最開始對這題的思路陷入了死胡同,只考慮到通過記錄兒子節點然後查詢兒子實現,這樣實現起來很多侷限性,而且效率可能不高,我還因為對鍊錶的使用不熟沒能實現。之後同學交流得知新思路。
思路:通過陣列巢狀儲存父節點就行了,看完之後甚至會覺得不是在做樹的問題。
#include#include#includeusing namespace std;
int b[100000];
struct node
a[100000];
int main()
for (i = n; i > 1; i--)
int m;
cin >> m;
for (i = 1; i <= m; i++)
for (i = 1; i <= m; i++)
return 0;
}
很多可能會因為看到是樹的問題就被束縛起來不會往這個方向想,我就是這樣,但願以後可以發散思維。 SAS中的summary過程簡介
summary過程主要用來對數值變數計算單個變數的基本統計量,使用語句與means過程類似。預設時summary過程不列印輸出計算結果。必須指定print選項才能輸出計算結果。語法格式 proc summary 選統計關鍵 var 變數名1變數名2 by 變數名1變數名2 class 變數名1變數名...
樹的簡單遍歷
include include malloc.h using namespace std typedef struct bitnodebitnode,bitree bitree create bitree t return t void preorder bitree t 先序遍歷 void ino...
樹的簡單問題
給定一顆樹,輸出樹的根root,孩子最多的結點max以及他的孩子。第一行 n 結點個數 100 m 邊樹 100 以下m行 每行倆個結點x和y,表示y是x的孩子 x,y 1000 第一行 樹根root。第二行 孩子最多的結點max。第三行 max的孩子。8 74 1 4 21 3 1 52 6 2 ...