权值线段树 0 pts 求调
查看原帖
权值线段树 0 pts 求调
255077
麦克斯韦の妖楼主2022/9/30 11:58
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<deque>
#include<queue>
#include<map>
#include<vector>
#include<stack>
#include<assert.h>
#include<set>
#define ls o<<1
#define rs o<<1|1
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=4e5+1;
const int L=1e5;
const int M=N-1;
int n,minn;
int tr[N<<2];
int lazy[N<<2];
void pushup(int o)
{
	tr[o]=tr[ls]+tr[rs];
}
void update(int o,int l,int r,int k,int x)
{
	if(l==r)
	{
		tr[o]+=x;
		return ;
	}
	int mid=(l+r)>>1;
	if(k<=mid) update(ls,l,mid,k,x);
	else update(rs,mid+1,r,k,x);
	pushup(o);
}
void FG(int o,int l,int r,int L,int R)
{
	if(l==r)
	{
		tr[o]=0;
		return;
	}
	int mid=(l+r)>>1;
	if(tr[ls] && L<=mid) FG(ls,l,mid,L,R);
	if(tr[rs] && R>mid) FG(rs,mid+1,r,L,R);	
	pushup(o);
}
int query(int o,int l,int r,int L,int R)
{
	if(l>R || r<L) return 0;
	if(l>=L && r<=R) return tr[o];
	int mid=(l+r)>>1;
	return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int queryK(int o,int l,int r,int k)
{
	if(l==r) return l;
	int mid=(l+r)>>1;
	if(tr[ls]>=k) queryK(ls,l,mid,k);
	else queryK(rs,mid+1,r,k-tr[ls]);
}
int f,g,ans;
int main()
{
	scanf("%d%d",&n,&minn);
	f=minn;
	minn+=L;
	while(n--)
	{
		char s=getchar();
		while(!(s>='A' && s<='Z')) s=getchar();
		int k;
		scanf("%d",&k);
		if(s=='I')
		{
			if(k<f) continue;
			update(1,0,M,k-g+L,1);
		}
		if(s=='A')
		{
			minn-=k;
			g+=k;
		}
		if(s=='S')
		{
			minn+=k;
			g-=k;
			if(minn>=1 && query(1,0,M,0,minn-1)>0) 
			{
				ans+=query(1,0,M,0,minn-1);
				FG(1,0,M,0,minn-1);	
			}
		}
		if(s=='F')
		{
			if(k>query(1,1,M,minn,M)) printf("-1\n");
			else printf("%d\n",queryK(1,0,M,k)+g-L);
		}
	}
	printf("%d\n",ans);
} 

2022/9/30 11:58
加载中...