线段树+动态开点80分求助
查看原帖
线段树+动态开点80分求助
418419
ko_no_lzx_da楼主2022/1/7 13:29
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
long long jld;
long long m,d,t=0,aa=0; 
long long ll,rr,kk;
long long mmax=-0x7fffffff;
long long top=1; 
struct node{
	long long maxx=0;
	long long l,r;
}tree[5005000];
//vector<node> tree;
long long ans=0;
void ddxg(long long l,long long r,long long n) {
	if(l>aa||r<aa)return;
	if(l==r&&r==aa){
		tree[n].maxx=jld;
//		cout <<">>:"<<n<<endl;
		return; 
	}
	ddxg(l,(l+r)/2,tree[n].l);
	ddxg((l+r)/2+1,r,tree[n].r);
	tree[n].maxx=max(tree[tree[n].l].maxx,tree[tree[n].r].maxx);
}
void build(long long l,long long r,long long n){
	tree[n].l=++top;
	tree[n].r=++top;
	if(l==r){
		tree[n].maxx=jld%d;
		return;
	}
	build(l,(l+r)/2,tree[n].l);
	build((l+r)/2+1,r,tree[n].r);
	tree[n].maxx=max(tree[tree[n].l].maxx,tree[tree[n].r].maxx);
}
void qjcx(long long l, long long r,long long n){
	if(ll<=l&&r<=rr){
		if(mmax<tree[n].maxx)mmax=tree[n].maxx;
		return;
	}
	if(ll<=(l+r)/2)qjcx(l,(l+r)/2,tree[n].l);
	if(rr>(l+r)/2)qjcx((l+r)/2+1,r,tree[n].r);
}

int main(){
	cin >>m>>d;
	build(1,109000,1);
	for(long long i=1;i<=m;i++){
		char pp;
		long long qq;
		ans=0;
		cin >>pp;
		if(pp=='A'){
			cin >>qq;
			aa++;
			jld=(qq+t)%d;
			ddxg(1,109000,1);
//			cout <<aa<<endl;jajjiny  kadokiny
//			long long t=1,t1=1;
//			for(long long j=1;j<=9;j++){
//				cout <<j<<":["<<tree[j].l<<" "<<tree[j].r<<"]"<<"("<<tree[j].maxx<<") ";
//				if(t==j){
//					cout <<endl;
//					t+=2*t1;
//					t1++;
//				}
//			}	
//			cout <<endl;  
		}
		if(pp=='Q'){
			cin >>qq;
			ll=aa-qq+1;
			rr=aa;
			qjcx(1,109000,1); 
			cout <<mmax%d<<endl;
			t=mmax;
			mmax=-0x7fffffff;
		}
	}
	return 0;
}


2022/1/7 13:29
加载中...