首页 > 代码库 > Codeforces Round #420 C
Codeforces Round #420 C
Okabe and Boxes
题意:有2个操作,add x表示往栈里加入一个数x,remove表示从栈里拿出一个数,若要使得出栈的顺序为递增的,那么至少要对栈里面的元素进行多少次重新排序
思路:stack模拟栈,优先队列模拟出栈,每次记录当前最顶上的元素top,用来和当前出栈的数比较,如果不相等,则进行排序,并标记f表示已经是排好序的位置,若相等,则出栈,然后更新top,注意更新top的时候是取优先队列里的还是stack里的数,若当前的位置大于f,则取栈里的元素更新top,否则取优先队列里的数
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int N=1e5+100; priority_queue<int,vector<int>,greater<int> > Q; int tot[3*N],t,p=1,ans,f,top; char s[10]; int main(){ int n,x; cin>>n; for(int i=1; i<=2*n; ++i){ cin>>s; if(s[0]==‘a‘){ cin>>x; Q.push(x); tot[++t]=x; top=x; } else{ //cout<<t<<" "<<f<<endl;cout<<top<<" "<<Q.top()<<endl; Q.pop(); if(top==p){ p++;t--; if(t>f){ top=tot[t]; } else{ top=Q.top(); if(top==p) f--; } } else{ //cout<<"uuuu"<<endl; ans++; p++; top=Q.top(); f=--t; } } } cout<<ans; return 0; } /* 3 add 1 remove add 2 add 3 remove remove 7 add 3 add 2 add 1 remove add 4 remove remove remove add 6 add 7 add 5 remove remove remove 6 add 3 add 4 add 5 add 1 add 6 remove add 2 remove remove remove remove remove 7 add 4 add 6 add 1 add 5 add 7 remove add 2 remove add 3 remove remove remove remove remove */
Codeforces Round #420 C
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。