社区讨论

求助为什么0分

P1198[JSOI2008] 最大数参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7rk2ss
此快照首次捕获于
2025/11/21 02:27
4 个月前
此快照最后确认于
2025/11/21 02:27
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=200001;
typedef long long ll;
struct node{
	int l;
	int r;
	ll val;
};
node tree[4*MAXN];
ll n,D,x,t=0,l=0;
char ask_or_add;
template<typename ReadType>void read(ReadType &n){
	ReadType x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	n=x*f;
}
inline ll __max(ll a,ll b){
	return a>b?a:b;
}
void add(int pos,int x,int val){
	if(tree[pos].l==tree[pos].r){
		tree[pos].val=val;
		return;
	}
	int mid=(tree[pos].l+tree[pos].r)>>1;
	if(mid>=x)add(pos<<1,x,val);
	if(mid<x)add(pos<<1|1,x,val);
	tree[pos].val=__max(tree[pos<<1].val,tree[pos<<1|1].val)%D;
}
ll query(int l,int r,int pos){
	if(l<=tree[pos].l&&r>=tree[pos].r){
		return tree[pos].val;
	}
	int mid=(l+r)>>1;
	ll a=-1*(184467440737095516);
	ll b=-1*(184467440737095516);
	if(mid>=l)a=query(pos<<1,l,mid);
	if(mid<r)b=query(pos<<1|1,mid+1,r);
	return __max(a,b)%D;
}
int main()
{
	read(n);read(D);
	cout<<n;
	int cur=0;
	for(int i=1;i<=n;++i)
	{
		scanf("%c",&ask_or_add);
		if(ask_or_add=='Q'){
			read(x);
			if(x==0)t=0;
			else t=query(cur-x+1,cur,1);
			printf("%d\n",t);
		}
		else{
			read(x);
			add(1,cur+1,(x+t)%D);
			cur++;
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...