pat1057 stack 分块的做法

来源:互联网 发布:仙界网络直播间sodu 编辑:程序博客网 时间:2024/05/16 20:39
#include<algorithm>#include<cstdio>#include<iostream>#include<string>#include<cstring>#include<vector>#include<set>#include<map>#include<queue>#include<stack>#define ll long longusing namespace std;int table[100005],bucket[1005];stack<int>st;int n,m;int find(){int ret = 0,id = st.size()%2?(st.size()+1)/2:st.size()/2;for(int i = 0;;i++){ret+=bucket[i];if(ret>=id){ret-=bucket[i];for(int j = i*m+1;;j++){ret+=table[j];if(ret>=id)return j;}}}}int main(){int i,j,x;char s[15];while(scanf("%d",&n)!=EOF){m = sqrt(n)+1;for(i = 0;i<n;i++){scanf("%s",s);if(s[1] == 'o'){if(st.size() == 0)printf("Invalid\n");else {printf("%d\n",st.top());bucket[(st.top()-1)/m]--;table[st.top()]--;    st.pop();}}else if(s[1] == 'u'){scanf("%d",&x);bucket[(x-1)/m]++;table[x]++;st.push(x);}else {if(st.size() == 0)printf("Invalid\n");else printf("%d\n",find());}}}return 0;}

0 0