90pts,求助!
查看原帖
90pts,求助!
907430
corner_xiejunqi楼主2024/12/27 21:07

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
const int len=2e5;
#define lc p<<1
#define rc p<<1|1
int n,m;
int a[N],tree[N*4],tag[N*4];
char s;
inline void push_up(int p){
	tree[p]=tree[lc]+tree[rc];
}
inline void update(int p,int l,int r,int x,int y){
	if(l==r){
		tree[p]+=y;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid) update(lc,l,mid,x,y);
	else update(rc,mid+1,r,x,y);
	push_up(p);
}
inline int query(int p,int l,int r,int x,int y){
	if(x<=l && r<=y) return tree[p];
	int mid=l+r>>1,ans=0;
	if(x<=mid) ans+=query(lc,l,mid,x,y);
	if(y>mid) ans+=query(rc,mid+1,r,x,y);
	return ans;
}
int minn;
inline int top_10(int p,int l,int r,int x){
	if(l==r) return l;
	int mid=l+r>>1,l1=-1,r1=-1;
	if(minn<l) l1=tree[lc];
	else if(l<=minn && minn<=mid) l1=query(lc,l,mid,minn,mid);
	else if(mid<minn && minn<=r) r1=query(rc,mid+1,r,minn,r);
	else r1=tree[rc];
	if(r1==-1) r1=tree[p]-l1;
	l1=tree[p]-r1;
	if(r1>=x) return top_10(rc,mid+1,r,x);
	else return top_10(lc,l,mid,x-r1);
}
inline void clear(int p,int l,int r,int x,int y){
	if(l==r){
		tree[p]=0;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid && tree[lc]) clear(lc,l,mid,x,y);
	if(y>mid && tree[rc]) clear(rc,mid+1,r,x,y);
	push_up(p);
}
signed main(){
	// step 1、读题、声明变量
	cin.tie(0);cout.tie(0);
	ios::sync_with_stdio(false);
	// step 2、输入
	cin>>n>>m;
	int lm=m,b=0;
	m+=len;
	int ans=0;
	// step 3、处理
	for(int i=1;i<=n;i++){
		int x;
		cin>>s>>x;
		if(s=='I'){
			if(x<lm) continue;
			update(1,0,N-1,x-b+len,1);
		}else if(s=='A') m-=x,b+=x;
		else if(s=='S'){
			m+=x,b-=x;
			if(m>=1 && query(1,0,N-1,m,N-1)>0){
				ans+=query(1,0,N-1,0,m-1);
				clear(1,0,N-1,0,m-1);
			}
		}else{
			if(x>query(1,1,N-1,m,N-1)) cout<<-1<<'\n';
			else cout<<top_10(1,0,N-1,x)+b-len<<'\n';
		}
	}
	// step 4、输出
	cout<<ans;
	return 0;
}


2024/12/27 21:07
加载中...