洛谷1198 最大数(线段树)

洛谷传送门

【题目分析】

数学计算一题差不多。

就是开一个q那么大的线段树,初始叶子节点全部为0,操作都很常规。。。。比较氵的题。

【代码~】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;;
const int INF=0x3f3f3f3f;

int q,cnt;
int maxx[MAXN],a[MAXN],mod,last;

int Read()
{
    int i=0,f=1;
    char c;
    for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
    if(c=='-')
      f=-1,c=getchar();
    for(;c>='0'&&c<='9';c=getchar())
      i=(i<<3)+(i<<1)+c-'0';
    return i*f;
}

void push_up(int root)
{
	maxx[root]=max(maxx[root<<1],maxx[root<<1|1]);
}

void update(int root,int l,int r,int x,int key)
{
    if(l==r)
    {
        maxx[root]=key;
    	return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
	  update(root<<1,l,mid,x,key);
	else 
	  update(root<<1|1,mid+1,r,x,key);
	push_up(root);
}

int query(int root,int l,int r,int L,int R)
{
	if(l>R||r<L)
	  return 0;
    if(L<=l&&r<=R)
      return maxx[root];
    int mid=l+r>>1;
    if(R<=mid)
      return query(root<<1,l,mid,L,R);
    else
    {
    	if(L>mid)
    	  return query(root<<1|1,mid+1,r,L,R);
    	else
    	  return max(query(root<<1,l,mid,L,mid),query(root<<1|1,mid+1,r,mid+1,R));
    }
}

int main()
{
    q=Read(),mod=Read();
    for(int i=1;i<=q;++i)
	{
	    char cz[5];
	    scanf("%s",&cz);
	    if(cz[0]=='A')
		{
		    ++cnt;
		    int x=Read(); 
		    x=(x%mod+last%mod)%mod;
		    update(1,1,q,cnt,x);
		}
		else
		{
			int x=Read();
		    last=query(1,1,q,cnt-x+1,cnt);
		    printf("%d\n",last);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/g21glf/article/details/83421488
今日推荐