栈 Okabe and Boxes:CodeForces - 821C
2017-09-19 19:09
543 查看
题目:
Okabe and Boxes:CodeForces - 821C题意:
有编号1-n的n个箱子。现在有两种操作add x
remove
操作1表示将编号为x的箱子放入栈内,操作2表示拿出栈顶的箱子。现在给出2n个操作,为了保证出栈的顺序是1~n,可以允许在操作2执行之前,将栈内元素进行排序。现在问,最少要多少次排序操作,才能保证出栈的顺序是1~n?
数据范围:1<=n<=3e5
思路:
由于n比较大,完全模拟肯定会超时。如何才能避免在数据上真的进行排序呢?我们可以发现,如果进行一次排序后,肯定是将栈内全部元素进行排序,而且排序后,这些元素相当于变成了一个整体,每次从这个整体内取箱子的话,肯定是按照大小顺序的。如果我们能执行这种整合操作,而不是去排序的话,这个时间复杂度就可以了。有个简单的实现办法,我们将栈底作为特别标记。当需要整合的时候,就将所有元素放到栈底的后面。这样,当栈为空,而需要执行remove的时候。其实就是从整体内取箱子了,一定是成功的、不许要排序的。
代码怎么写呢?当需要排序时,直接将size=0,当做所有元素压入栈底。当size=0,执行的是remove的时候,直接忽略这个remove就可以了。
代码:
#include <cstdio> using namespace std; int n,s[300005],top; int main() { int i,j,ans=0; char op[15]; scanf("%d",&n); for(i=j=1;i<=2*n;++i) { scanf("%s",op); if(op[0]=='a') scanf("%d",&s[++top]); else { if(top) { if(s[top]==j) --top; else top=0,++ans; } ++ j; } } printf("%d\n",ans); }
相关文章推荐
- Codeforces 821C-Okabe and Boxes
- codeforces 420-C. Okabe and Boxes
- codeforces 420 div2 C Okabe and Boxes
- Okabe and Boxes CodeForces - 821C
- 821C - Okabe and Boxes ——优先队列+手动模拟栈
- Codeforces 821 C. Okabe and Boxes
- Codeforces Round #420 (Div. 2) 821C - Okabe and Boxes 【思维题】
- CodeForces 768 F.Barrels and boxes(组合数学)
- coderforces round#420-C Okabe and Boxes
- 【codeforces 768F】 Barrels and boxes
- Okabe and Boxes (栈 易)
- Codeforces Round #420 (Div. 2) C - Okabe and Boxes
- 【codeforces 821E】Okabe and El Psy Kongroo
- Codeforces 821A-Okabe and Future Gadget Laboratory
- CF Okabe and Boxes
- Codeforces 821B-Okabe and Banana Trees
- codeforce C. Okabe and Boxes
- 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes
- Codeforces#420 Okabe and Boxes
- Codeforces 390C Inna and Candy Boxes(dp)