BZOJ1012——[JSOI2008]最大数maxnumber

时间:2021-11-29 09:13:25

1、题目大意:求末尾L个数的最大值,强制在线

2、分析:这个拿线段树可以直接水过,然后我写了一个 维护单调栈, 二分求最大值的短代码,手懒。。。。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
pair<LL, LL> a[1000000];
LL tot;
int main(){
    LL M, D;
    scanf("%lld%lld", &M, &D);
    LL ans = 0;
    LL cnt = 0;
    while(M --){
        char str[2];
        LL d;
        scanf("%s%lld", str, &d);
        if(str[0] == 'A'){
            d += ans;
            d %= D;
            cnt ++;
            while(tot >= 1 && a[tot].second < d) tot --;
            a[++ tot].first = cnt;
            a[tot].second = d;
        }
        else{
            d = (cnt - d + 1);
            LL l = 1, r = tot;
            while(l < r){
                LL mid = (l + r) / 2;
                if(a[mid].first < d) l = mid + 1;
                else r = mid;
            }
            ans = a[l].second;
            printf("%lld\n", ans);
        }
    }
    return 0;
}