1 solutions

  • 1
    @ 2025-5-11 21:32:09

    单调栈写法:

    #include<bits/stdc++.h>
    using namespace std;
    int m, d, t = 0, size = 0;
    pair<int, long long> stk[500010]; // 单调栈,first是位置,second是值
    int main() {
        cin >> m >> d;
        int top = 0; // 栈顶指针
        
        for(int i = 0; i < m; i++) {
            char op;
            cin >> op;
            if(op == 'A') {
                long long n;
                cin >> n;
                n = (n + t) % d;
                size++;
                
                // 使用二分查找确定插入位置
                int left = 1, right = top, pos = top + 1;
                while(left <= right) {
                    int mid = (left + right) / 2;
                    if(stk[mid].second <= n) {
                        pos = mid;
                        right = mid - 1;
                    } else {
                        left = mid + 1;
                    }
                }
                
                // 更新栈顶指针
                top = pos;
                stk[top] = {size, n};
            } 
            else if(op == 'Q') {
                int L;
                cin >> L;
                // 在栈中二分查找第一个位置 >= size-L+1的元素
                int target = size - L + 1;
                int left = 1, right = top, ans = top;
                
                while(left <= right) {
                    int mid = (left + right) / 2;
                    if(stk[mid].first >= target) {
                        ans = mid;
                        right = mid - 1;
                    } else {
                        left = mid + 1;
                    }
                }
                
                t = stk[ans].second;
                cout << t << endl;
            }
        }
        return 0;
    }
    
    • 1

    Information

    ID
    198
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    4
    Tags
    # Submissions
    9
    Accepted
    1
    Uploaded By