单调栈线性处理序列每个数右侧第一个非倍数位置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);
}

浙公网安备 33010602011771号