分块0pts求调(悬1关)
查看原帖
分块0pts求调(悬1关)
1023793
yaodiguoan楼主2024/5/28 13:58

记录

#include <iostream>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
namespace quickread{
	inline int read(){
		int x=0;bool f=1;char ch=getchar();
		while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
		while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
		return x*f;
	}
	inline void write(int x){
	    if(x<0){putchar('-');x=-x;}
	    if(x>9)write(x/10);
        putchar(x%10+'0');
	}
	inline char readchar(){
		char ch=getchar();
		while(ch!='A'&&ch!='Q') ch=getchar();
		return ch;
	}
}
using namespace quickread;
const int N=5e6+10;
int n,m,q,len;
int mod,t,a[N],st[N],ed[N],pos[N],val[N];
void build(){
	memset(a,-0x3f,sizeof(a));
	memset(val,-0x3f,sizeof(val));
	len=1e3;
	m=q/len;
	if(m*len!=q) m++;
	for(int i=1;i<=m;i++){
		st[i]=ed[i-1]+1;
		ed[i]=ed[i-1]+len;
		for(int j=st[i];j<=ed[i];j++) pos[j]=i;
	}
	ed[m]=q;
}
void update(int k){
	k%=mod;
	while(k<0) k+=mod;
	a[++n]=k;
	val[pos[n]]=max(val[pos[n]],k);
}
int query(int l,int r){
	int lt=pos[l],rt=pos[r];
	int ans=-0x3f3f3f3f3f3f3f3f;
	if(lt==rt){
		for(int i=l;i<=r;i++) ans=max(ans,a[i]);
	}else{
		for(int i=lt+1;i<=rt-1;i++) ans=max(ans,val[i]);
		for(int i=st[rt];i<=r;i++) ans=max(ans,a[i]);
		for(int i=l;i<=ed[lt];i++) ans=max(ans,a[i]);
	}
	return t=ans;
}
signed main(){
	q=read(),mod=read();
	build();
	while(q--){
		char opt=readchar();
		int x=read();
		if(opt=='A') 
			update(x+t),t=0;
		else
			write(query(n-x+1,n)),putchar('\n');
	}
	return 0;
}

虽然前面还发过一个求助帖,但代码不一样

2024/5/28 13:58
加载中...