思路
对于这些操作全可以放到树状数组上进行,我们用权值记录,到了哪个位子有多少个数,假如要删除,我们直接二分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;
}
京公网安备 11010502036488号