P1198 [JSOI2008] 最大数

 

 

》》》 RMQ -》 dp

》》》dp 泛着定义 f[i][j] -> i-1<<j+1 -> 每一部分 1<<j

/*5 100
A 96
Q 1
A 97
Q 1
Q 2

96
93
96
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;

ll a[200001],f[200001][22],lg[200001]={-1};
ll m,d,n=0;

//ll a[200001],f[200001][22],d,lg[200001]={-1};
//ll n,m;

void add(int u)
{
    f[u][0]=a[u];
    for(int i=1;u-(1<<i)+1>=1;i++) f[u][i]=max( f[u][i-1], f[ u-(1<<(i-1)) ][i-1] );
}
ll get(int x,int y)
{
    int t=lg[y-x+1];
    return max(f[y][t],f[x+(1<<t)-1][t]);
}

int main()
{
    memset(f,0,sizeof(f));
    //ios::sync_with_stdio(false); cin.tie(0);
    cin>>m>>d;
    
    for(int i=1;i<=2*m;i++) lg[i]=lg[i>>1]+1;
    
    ll t=0;
    
    for(int i=1;i<=m;i++)
    {
        char ch;
        cin>>ch;
        
        if(ch=='A')
        {
            ll tmp;
            cin>>tmp;
            a[++n]=(tmp+t)%d;
            add(n);
        } 
        else 
        {
            ll l; cin>>l;
            //can ignore
            if(l==1){
                cout<<a[n]<<'\n';
                t=a[n];
                continue;
            }
            //
            t=get(n-l+1,n);
            cout<<t<<'\n';
        }
    }
    return 0;
}
View Code

 

 
 
 
posted @ 2023-08-04 00:03  JMXZ  阅读(13)  评论(0)    收藏  举报