Official
L - 書き換え/Rewriting Editorial by admin
「\(f(x) =\) 元の整数が \(x\) であったときの現時点の値」という関数を考えると、いかなる時点でもこの関数は(\(-10^9 \le x \le 10^9\) の範囲では)以下のいずれかの形をしています。
- \(f(x) = max(L, min(x, R))\)
- \(f(x) = max(L, min(-x, R))\)
したがって、「\(x\) にかかる係数(\(1\) または \(-1\))」「\(L,R\)」のみを計算していくことで、\(O(N + Q)\) でこの問題を解くことが出来ます。
解答例:
#include<bits/stdc++.h>
using namespace std;
int main() {
int N, Q;
cin >> N >> Q;
int l = -1e9, r = 1e9, sign = 1;
for (int i = 0; i < N; i++) {
string s; int p;
cin >> s >> p;
if (s == "NEGATE") {
l = -l;
r = -r;
swap(l,r);
sign = -sign;
} else if (s == "CHMIN") {
l = min(l, p);
r = min(r, p);
} else {
l = max(l, p);
r = max(r, p);
}
}
for (int i = 0; i < Q; i++) {
int q;
cin >> q;
int ans = q*sign;
ans = max(ans, l);
ans = min(ans, r);
cout << ans << '\n';
}
return 0;
}
posted:
last update: