CF374D Inna and Sequence
考虑到删数操作,所以只需要维护每个数是没被删除的第几个就行了,记没删除的数状态是 \(1\),删除的状态是 \(0\),那么实际位置就是状态的前缀和。用树状数组动态维护就可以了。
找第 \(a_i\) 个没被删的数的话,用二分就可以实现。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
using namespace std;
const int N = 1.5e6;
int tr[N], ins[N], a[N], b[N], len = 0;
int n, m, del = 0;
int lowbit(int x){
return x & -x;
}
void add(int x, int y){
for(; x <= n; x += lowbit(x)){
tr[x] += y;
}
return ;
}
void print(){
F(i, 1, len){
if(ins[i]){
// printf("%d", b[i]);
cout << b[i];
}
}
}
int ask(int x){
int ret = 0;
for(; x >= 1; x -= lowbit(x)){
ret += tr[x];
}
return ret;
}
void Main(){
cin >> n >> m;
F(i, 1, m) cin >> a[i];
F(q, 1, n){
// printf("q = %d:\n", q);
int x;
cin >> x;
if(x == -1){
F(i, 1, m){
int l = 0, r = len + 1, mid;
while(l + 1 < r){
mid = (l + r) / 2;
if(ask(mid) >= a[i] - (i - 1)) r = mid;
else l = mid;
}
int ps = r;
// printf("i = %d\tps = %d\ts = %d\n", i, ps, ask(ps));
if(ps <= len){
ins[ps] = 0;
++ del;
add(ps, -1);
}
else break;
}
}
else{
++ len;
add(len, 1);
b[len] = x;
ins[len] = 1;
}
// print();
// printf("\n");
}
if(del == len){
cout << "Poor stack!\n";
}
else{
print();
}
return ;
}
signed main(){
// freopen("inna.in", "r", stdin);
// freopen("inna.out", "w", stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T = 1;
while(T --) Main();
return fflush(0), 0;
}

浙公网安备 33010602011771号