D - Make Target 2 解説
by
tempura0224
\(L, R, U, D\) のうち絶対値が最大であるものに注目しましょう。
- \(|L|\) が最大の場合、\(x = L\) 上の格子点の色は全て \(L\) の偶奇によってのみ決まります。
- \(|R|\) が最大の場合、\(x = R\) 上の格子点の色は全て \(R\) の偶奇によってのみ決まります。
- \(|U|\) が最大の場合、\(y = U\) 上の格子点の色は全て \(U\) の偶奇によってのみ決まります。
- \(|D|\) が最大の場合、\(y = D\) 上の格子点の色は全て \(D\) の偶奇によってのみ決まります。
この事実を利用すると、行の数、または列の数が \(1\) 小さい問題に帰着することができます。 これを行数または列数が \(0\) になるまで繰り返すことで、この問題を \(O(R-L + D - U)\) で解くことができます。
実装例(C++)
#include <bits/stdc++.h>
using namespace std;
int main() {
int l, r, u, d;
cin >> l >> r >> u >> d;
long long ans = 0;
while(l <= r && u <= d) {
int ma = max({abs(l), abs(r), abs(u), abs(d)});
if(abs(l) == ma) {
if(l % 2 == 0) {
ans += d - u + 1;
}
l += 1;
} else if(abs(r) == ma) {
if(r % 2 == 0) {
ans += d - u + 1;
}
r -= 1;
} else if(abs(u) == ma) {
if(u % 2 == 0) {
ans += r - l + 1;
}
u += 1;
} else {
if(d % 2 == 0) {
ans += r - l + 1;
}
d -= 1;
}
}
cout << ans << endl;
return 0;
}
投稿日時:
最終更新:
