加载中...

单调栈线性处理序列每个数右侧第一个非倍数位置trick

比较显然的做法是 ST 表处理 \(\gcd\) + 二分,复杂度 \(O(n \log n \log A)\)。这里记录一种直接用单调栈维护的 \(O(n)\) 做法:

vector<int> R(n + 1, n + 1); // R[i]:在位置i右侧,第一个不是 a[i] 倍数的位置 j(a[j] % a[i] != 0)
stack<int> stk;
for(int i = 1; i <= n; i ++){
    while(!stk.empty() && a[i] % a[stk.top()] != 0){
        R[stk.top()] = i;
        stk.pop();
    }
    stk.push(i);
}
posted @ 2026-07-02 08:19  小橘奏  阅读(15)  评论(0)    收藏  举报