社区讨论

线段树全MLE求救

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mk7vjn2h
此快照首次捕获于
2026/01/10 13:38
上个月
此快照最后确认于
2026/01/12 21:00
上个月
查看原帖
rt
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mid ((l+r)>>1)
const int N=2e5+5;
int m,d,n,t,len;
char c;
int tree[N*4];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void pushup(int x){
	tree[x]=max(tree[ls(x)],tree[rs(x)]);
	return;
}
void update(int l,int r,int x,int u,int k){
	if(l==u&&l==r){
		tree[x]=k;
		return;
	}
	if(l<=u&&u<=mid)update(l,mid,ls(x),u,k);
	if(mid+1<=u&&u<=r)update(mid+1,r,rs(x),u,k);
	pushup(x);
	return;
}
int query(int l,int r,int x,int L,int R){
	if(L<=l&&r<=R){
		return tree[x];
	}
	int res=-1e9;
	if(L<=mid)res=query(l,mid,ls(x),L,R);
	if(R>=mid+1)res=max(res,query(mid+1,r,rs(x),L,R));
	return res;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>m>>d;
	while(m--){
		cin>>c>>n;
		if(c=='A'){
			len++;
			update(1,m,1,len,(n+t)%d);
		}else{
			int ans=query(1,m,1,len-n+1,len);
			cout<<ans<<'\n';
			t=ans;
		}
	}
	return 0;
}
思路就是普通单点修改+区间最值查询,这题是不是不能用线段树做/ll

回复

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

正在加载回复...