爆零求助
查看原帖
爆零求助
537046
大眼仔Happy楼主2024/5/7 18:04

确信是正解的做法。

#include<bits/stdc++.h>
using namespace std;
const int N=250005;
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int n,m,st,cnt,pos[15];
struct data{int v,id;}d[N];
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
int t[N<<2];
void build(int k,int l,int r)
{
	if(l==r)return t[k]=d[l].v,void();
	build(ls,l,mid);
	build(rs,mid+1,r);
	t[k]=max(t[ls],t[rs]);
}
void upd(int k,int l,int r,int q,int v)
{
	if(l==r)return t[k]=v,void();
	if(q<=mid)upd(ls,l,mid,q,v);
	else upd(rs,mid+1,r,q,v);
	t[k]=max(t[ls],t[rs]);
}
int ask(int k,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)return t[k];
	int res=0;
	if(ql<=mid)res=max(res,ask(ls,l,mid,ql,qr));
	if(qr>mid)res=max(res,ask(rs,mid+1,r,ql,qr));
	return res;
}
#undef mid
int main(){
	n=read();st=read();cnt=min(10,n);
	for(int i=1;i<=n;i++)d[i]=(data){read(),i};
	d[0].v=d[n+1].v=1e9;
	build(1,0,n+1);
	
	sort(d+1,d+1+n,[](data A,data B){return A.v>B.v;});
	for(int i=1;i<=cnt;i++)pos[i]=d[i].id;
	sort(d+1,d+1+n,[](data A,data B){return A.id<B.id;});
	
	m=read();
	while(m--)
	{
		char op[3];
		scanf("%s",op);
		if(op[0]=='E')
		{
			int id=read(),rnk=read();
			for(int i=cnt;i>=rnk;i--)pos[i+1]=pos[i];
			d[id].v=d[pos[rnk]].v;pos[rnk]=id;
			for(int i=1;i<=rnk;i++)upd(1,0,n+1,pos[i],++d[pos[i]].v);
		}
		else 
		{
			int ed=read(),mx,l,r;
			if(st==ed){printf("0\n");continue;}
			if(st<ed)
			{
				mx=ask(1,0,n+1,st+1,ed);
				l=0,r=st-1;
				while(l<r)
				{
					int mid=l+r+1>>1;
					if(ask(1,0,n+1,mid,st-1)>mx)l=mid;
					else r=mid-1;
				}
				printf("%d\n",ed-l-1);
			}
			else 
			{
				mx=ask(1,0,n+1,ed,st-1);
				l=st+1;r=n+1;
				while(l<r)
				{
					int mid=l+r>>1;
					if(ask(1,0,n+1,st+1,mid)>mx)r=mid;
					else l=mid+1;
				}
				printf("%d\n",r-ed-1);
			}
		}
	}
	return 0;
}
2024/5/7 18:04
加载中...