前往
大廳
主題

ZeroJudge - f929: 程式老師的作業 解題心得

Not In My Back Yard | 2021-06-12 00:00:01 | 巴幣 0 | 人氣 170

題目連結:


題目大意:
輸入第一列給定一正整數 n (n ≦ 10 ^ 6),代表某一個陣列(索引值從 0 開始)有 n 個數字。接著的第二列給定 n 個數字,代表該陣列內容。接著的一列 m (m ≦ 10 ^ 5),代表有 m 筆操作。

接下來有 m 列,每列代表著一次操作。操作有以下三種模式:
1 x ,將陣列中值為 0 且索引值最小的元素,其值改為 x 。如果不存在這樣的元素則忽略本操作;
2 x ,將索引值為 x 的元素之值改為 0 。
3 ,輸出陣列中值為 0 且索引值最小的元素其索引值本身。如果不存在,則輸出 -1 。



範例輸入:
範例輸入 #1
5
0 1 2 3 4
3
1 5
2 3
3

範例輸入 #2
5
1 2 3 4 5
4
1 2
3
2 4
3


範例輸出:
範例輸出 #1
3

範例輸出 #2
-1
4


解題思維:
利用一個平衡二元樹(例如 C++ 的 set,其 set.begin() 預設為最小值(如果是存整數的話))來儲存值為 0 的索引值們,然後再一個普通的整數陣列來儲存陣列本身的內容。

然後對每一種操作去對樹或是陣列進行操作即可:
第一種操作,只要將 set.begin() 代表的陣列位置改為 x(前提是 set 不為空) ;然後判斷該位置是否仍為 0 。如果是就不需更動 set ;反之,則移除 set.begin() 之位置;

第二種操作,只需更動陣列索引值 x 之值。如果更動後之值為 0 ,則將 x 放入到 set 裡;

第三種操作,其更為簡單,只需要輸出 set.begin() 指涉的索引值即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作