思路
对于这些操作全可以放到树状数组上进行,我们用权值记录,到了哪个位子有多少个数,假如要删除,我们直接二分query那个位子就好了,然后把那个点标记成-1,然后输出的时候-1就不输出,其他就输出..
代码
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; int n,m,c[N],ans[N],a[N],id,sum,now[N]; int lowbit(int x) { return x&(-x); } void add(int u,int val) { while(u<=m) { c[u]+=val; u+=lowbit(u); } } int query(int u) { int res=0; while(u) { res+=c[u]; u-=lowbit(u); }return res; } int work(int u) { int l=1,r=m,ans=2e9; while(l<=r) { int mid=(l+r)>>1; if(query(mid)>=u) { r=mid-1; ans=min(ans,mid); } else l=mid+1; }return ans; } int main() { cin>>m>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) { int x;scanf("%d",&x); if(x==0||x==1) { ans[++id]=x; add(id,1),sum++; } else { int cnt=lower_bound(a+1,a+1+n,sum)-a; if(cnt>n) cnt--; else if(a[cnt]>sum) cnt--; sum-=cnt; for(int i=1;i<=cnt;i++) now[i]=work(a[i]); for(int i=1;i<=cnt;i++) { add(now[i],-1); ans[now[i]]=-1; } } }bool flag=false; for(int i=1;i<=id;i++) { if(ans[i]==-1) continue; flag=true; cout<<ans[i]; }if(!flag) cout<<"Poor stack!"; puts(""); return 0; }