[JSOI2008]最大数maxnumber

[JSOI2008]最大数maxnumber

标签: 线段树 单独队列


题目链接

题解

线段树裸题。
如果一直RE可能是你用的cin/cout。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
inline int read()
{
	int sum=0,p=1;char ch=getchar();
	while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();
	if(ch=='-')p=-1,ch=getchar();
	while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();
	return sum*p;
}
const int maxn=2e5+20;
int n;
int mod;

struct node {
	int mx;
	inline void Merge(node a,node b)
		{
			mx=max(a.mx,b.mx);
		}
};
node c[maxn*4];
void init()
{
	n=read();mod=read();
}

#define lc (o<<1)
#define rc (o<<1 | 1)
#define left lc,l,mid
#define right rc,mid+1,r

inline void update(int x,int d,int o,int l,int r)
{
	if(l==r)
	{
		c[o].mx=d;
		return;
	}
	register int mid=(l+r)>>1;
	if(x<=mid)update(x,d,left);
	else update(x,d,right);
	c[o].Merge(c[lc],c[rc]);
}

inline int query(int ql,int qr,int o,int l,int r)
{
	if(ql<=l && r<=qr)
	{
		return c[o].mx;
	}
	register int mid=(l+r)>>1;register int ans=0;
	if(ql<=mid)ans=max(ans,query(ql,qr,left));
	if(qr>mid)ans=max(ans,query(ql,qr,right));
	return ans;
}

inline void doing()
{
	register int t=0;
	int cnt=0;
	REP(i,1,n)
	{
		char ch[5];int x;
		scanf("%s",ch);
		if(ch[0]=='A')
		{
			cnt++;
			x=read();x=(x+t)%mod;
			update(cnt,x,1,1,n);
		}else
		{
			x=read();
			t=query(cnt-x+1,cnt,1,1,n);
			printf("%d
",t);
		}
	}
}

int main()
{
	init();
	doing();
	return 0;
}


原文地址:https://www.cnblogs.com/gzy-cjoier/p/7504090.html