Codeforces 821C Okabe and Boxes
阿新 • • 發佈:2017-06-28
做到 cnblogs 彈出 sta 分享 一次 har mov res
題意:
給定一個n,然後有2n個指令,分別是add x, remove, add x 就是將x加入到棧中, remove 就是從棧頂移除, 然後移除的元素一定要有序, 不然就需要resort(重排)一次, 問最少需要重排多少次。
分析:
可以看出,每次只有棧頂元素和應該移除的元素不符合時候才需要重排, 所以重排後可以想象成棧中所有的元素都在他最佳的位置,那麽我們就可以忽視掉這些重排後的元素, 把棧清空然後繼續執行操作, 這樣可以做到O(n)的復雜度。
另外如果棧頂元素正是需要移除的元素, 那麽我們就彈出棧頂元素,不需要清空。
代碼:
#include <bits/stdc++.h> usingnamespace 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