CF1904D

任意次选择一个子区间 A[lr]A[l\dots r],全部替换为子区间的最大值。判断是否可以通过若干次操作将数组 AA 变为数组 BB

对于每一个 B[i]B[i],判断能否在 AA 中 找到一个相等的元素 A[j]A[j],且 iijj 之间的所有 kk 都满足 A[k]B[i]A[k] \le B[i],且 B[k]B[i]B[k] \ge B[i]

这等价于 A[j]A[k]A[j] \geqslant A[k],且 A[j]B[k]A[j] \leqslant B[k]

因此需要维护一个递减的队列,如果 A[j]<A[k]A[j]<A[k],则淘汰 A[j]A[j]。同时,如果 A[j]>B[k]A[j]>B[k],需要淘汰队头的 A[j]A[j]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<int> cnt(N, 0); 
std::deque<int> dq;
for (int i = 0; i < N; i++) {
while (!dq.empty() && dq.back() < A[i]) {
cnt[dq.back()]--;
dq.pop_back();
}
if (dq.empty() || dq.back() > A[i]) {
dq.push_back(A[i]);
cnt[A[i]]++;
}
while (!dq.empty() && dq.front() > B[i]) {
cnt[dq.front()]--;
dq.pop_front();
}
if (cnt[B[i]] > 0) {
match[i] = true;
}
}