乙個學校裡老師要將班上n個同學排成一列,同學被編號為1\sim n1∼n,他採取如下的方法:
先將1號同學安排進佇列,這時佇列中只有他乙個人;
2-n2−n號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1∼(i−1)中某位同學(即之前已經入列的同學)的左邊或右邊;
從佇列中去掉m(m
在所有同學按照上述方法佇列排列完畢後,老師想知道從左到右所有同學的編號。
輸入格式:
第11行為乙個正整數n,表示了有n個同學。
第2-n2−n行,第ii行包含兩個整數k,pk,p,其中k為小於ii的正整數,pp為00或者11。若p為0,則表示將ii號同學插入到k號同學的左邊,p為1則表示插入到右邊。
第n+1行為乙個正整數m,表示去掉的同學數目。
接下來m行,每行乙個正整數x,表示將x號同學從佇列中移去,如果x號同學已經不在佇列中則忽略這一條指令。
輸出格式:
11行,包含最多n個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。
輸入樣例#1:複製
4
1 02 1
1 02
33
輸出樣例#1:複製
2 4 1
樣例解釋:
將同學22插入至同學11左邊,此時隊列為:
2 121
將同學33插入至同學22右邊,此時隊列為:
2 3 1231
將同學44插入至同學11左邊,此時隊列為:
2 3 4 12341
將同學33從佇列中移出,此時隊列為:
2 4 1241
同學33已經不在佇列中,忽略最後一條指令
最終佇列:
2 4 1241
資料範圍
對於20\%20%的資料,有n≤10n≤10;
對於40\%40%的資料,有n≤1000n≤1000;
對於100\%100%的資料,有n, m≤100000n,m≤100000。
解析:這題裡面涉及到插入和刪除,大家可以用鍊錶做,但是需要雙向鍊錶,所以我們這裡用二叉樹,因為這裡有左右兩個方向,這跟二叉樹兩個方向的原理很相同。
所以我們上**:
#includeusing namespace std;
struct node
q[200002];
int n, m;
void dfs(int x)///然後中序遍歷輸出
int main()
else
q[x].lef = i;
} else
else
q[x].rig = i;
} }cin >> m;
for (int i = 1; i <= m; i++)//將刪除的節點的vi標記為-1
dfs(1);
return 0;
}
佇列,二叉樹
一 佇列。1 什麼是佇列?在一條儲存結構中,插入節點與刪除節點分別在兩端進行,例如 插入資料在隊尾插入,刪除資料在隊頭進行,那麼這種邏輯關係就是叫做佇列,其特點 先進先出,後進後出。插入資料到佇列中 入隊。從佇列中刪除資料 出隊。2 設計佇列管理結構體和節點結構體。1 管理佇列的結構體。struct...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...