正在加载

请稍等

第一次加载可能稍慢

P1198 最大数 题解

Author: ljc Time: 2025/09/23 Tag: 题解

P1198 [JSOI2008] 最大数

P1198 最大数 - 洛谷

题目简化

维护一个数列,两个操作:

  • 查询:后$L$个数中的最大值

  • 添加:在最后添加一个数$(n+t\mod D)$

题解

本题直接使用线段树求取最大值,支持单点修改区间查询。

注意

由于有负数,需要在查询程序中写一个负数inf。

由于数据可能会很大,需要使用long long,不然 subtask 1 过不了

Code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll n,q,x,y,md,top;
char c;
ll f[800010];

void add(ll x,ll y,ll l,ll r,ll rt){
    if(l==r){
        f[rt] = y;
        return ;
    }
    ll mid = (l+r)>>1;
    if(x<=mid)add(x,y,l,mid,rt<<1);
    else add(x,y,mid+1,r,(rt<<1)+1);
    f[rt] = max(f[rt<<1],f[(rt<<1)+1]);
}

ll get(ll x,ll y,ll l,ll r,ll rt){
    if(x<=l and r<=y){
        return f[rt];
    }
    ll mid = (l+r)>>1,ans=-1234567890;
    if(x<=mid)ans=max(ans,get(x,y,l,mid,rt<<1));
    if(y>mid)ans=max(ans,get(x,y,mid+1,r,(rt<<1)+1));
    return ans;
}

signed main(){
    cin >> q >> md;
    for(int i=1;i<=q;i++){
        cin >>c >>x;
        if(c=='Q'){
            if(x==0) y=0;
            else y = get(top-x+1,top,1,q,1);
            cout << y << endl;
        }if(c=='A'){
            add(++top,(x+y)%md,1,q,1);
        }
    }
    return 0;
}

声明:本博客由作者原创,转载请标明出处。