CF374D Inna and Sequence

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;
}
posted @ 2026-10-03 16:49  superl61  阅读(2)  评论(0)    收藏  举报