1. 程式人生 > >Codeforces 821C Okabe and Boxes

Codeforces 821C Okabe and Boxes

做到 cnblogs 彈出 sta 分享 一次 har mov res

題意:

給定一個n,然後有2n個指令,分別是add x, remove, add x 就是將x加入到棧中, remove 就是從棧頂移除, 然後移除的元素一定要有序, 不然就需要resort(重排)一次, 問最少需要重排多少次。

技術分享

分析:

可以看出,每次只有棧頂元素和應該移除的元素不符合時候才需要重排, 所以重排後可以想象成棧中所有的元素都在他最佳的位置,那麽我們就可以忽視掉這些重排後的元素, 把棧清空然後繼續執行操作, 這樣可以做到O(n)的復雜度。

另外如果棧頂元素正是需要移除的元素, 那麽我們就彈出棧頂元素,不需要清空。

代碼:

#include <bits/stdc++.h>
using
namespace std; int n; int main() { vector<int> sta; scanf("%d", &n); int ans = 0; int trash = 1; int Top = 0; for(int kase = 0; kase < 2 * n; kase++){ char choice[20]; scanf("%s", choice); if(choice[0] == a){ int k; scanf(
"%d", &k); sta.push_back(k); } else{ if(!sta.empty()){ if(sta.back() != trash){ ans++; sta.clear(); } else sta.pop_back(); } trash++; } } printf(
"%d\n", ans); }

Codeforces 821C Okabe and Boxes