結果
| 問題 | No.3601 Queen Dist Sum with One Wall |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-06-23 00:32:10 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 195 ms / 2,000 ms |
| + 817µs | |
| コード長 | 3,474 bytes |
| 記録 | |
| コンパイル時間 | 351 ms |
| コンパイル使用メモリ | 80,256 KB |
| 実行使用メモリ | 5,888 KB |
| 最終ジャッジ日時 | 2026-07-24 20:31:27 |
| 合計ジャッジ時間 | 6,275 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 22 |
ソースコード
#include <iostream>
using namespace std;
using ll = long long;
ll solve(ll H, ll W, ll sx, ll sy, ll h, ll w){
// 壁がなかった場合をまず考える
ll ans = (H * W - 1) * 2;
ans -= (H - 1);
ans -= (W - 1);
ll d1 = min(sx + sy, min(H + W - 2 - (sx + sy), min(H, W) - 1));
ll d2 = min((sx - sy) - (-W + 1), min(H - 1 - (sx - sy), min(H, W) - 1));
ans -= d1;
ans -= d2;
if (sx == h){
ans--;
ll len_min, len_max;
ll br_x_max = max(sx, H - 1 - sx);
if (sy < w){
len_min = w - sy;
len_max = W - 1 - sy;
}
else{
len_min = sy - w;
len_max = sy;
}
ans -= (len_max - len_min);
// len_min より大きく len_max 以下の奇数・偶数の個数
ll odd_cnt = (len_max + 1) / 2 - (len_min + 1) / 2;
ll even_cnt = len_max / 2 - len_min / 2;
// 奇数:len_min より大きく br_x_max 以下の奇数の個数
ll odd_2_cnt = (br_x_max + 1) / 2 - (len_min + 1) / 2;
if (odd_2_cnt < 0) odd_2_cnt = 0;
// 偶数:len_min より大きく br_x_max * 2 以下の偶数の個数
ll even_2_cnt = br_x_max - len_min / 2;
if (even_2_cnt < 0) even_2_cnt = 0;
ans += min(odd_cnt, odd_2_cnt) * 2LL;
ans += min(even_cnt, even_2_cnt) * 2LL;
if (odd_cnt - odd_2_cnt > 0){
ans += (odd_cnt - odd_2_cnt) * 3LL;
}
if (even_cnt - even_2_cnt > 0){
ans += (even_cnt - even_2_cnt) * 3LL;
}
}
else if (sy == w){
ans--;
ll len_min, len_max;
ll br_y_max = max(sy, W - 1 - sy);
if (sx < h){
len_min = h - sx;
len_max = H - 1 - sx;
}
else{
len_min = sx - h;
len_max = sx;
}
ans -= (len_max - len_min);
// len_min より大きく len_max 以下の奇数・偶数の個数
ll odd_cnt = (len_max + 1) / 2 - (len_min + 1) / 2;
ll even_cnt = len_max / 2 - len_min / 2;
// 奇数:len_min より大きく br_x_max 以下の奇数の個数
ll odd_2_cnt = (br_y_max + 1) / 2 - (len_min + 1) / 2;
if (odd_2_cnt < 0) odd_2_cnt = 0;
// 偶数:len_min より大きく br_x_max * 2 以下の偶数の個数
ll even_2_cnt = br_y_max - len_min / 2;
if (even_2_cnt < 0) even_2_cnt = 0;
ans += min(odd_cnt, odd_2_cnt) * 2LL;
ans += min(even_cnt, even_2_cnt) * 2LL;
if (odd_cnt - odd_2_cnt > 0){
ans += (odd_cnt - odd_2_cnt) * 3LL;
}
if (even_cnt - even_2_cnt > 0){
ans += (even_cnt - even_2_cnt) * 3LL;
}
}
else if (sx + sy == h + w){
ans--;
if (sx < h){
ll rem = min(w, H - 1 - h);
ans += rem;
}
else{
ll rem = min(W - 1 - w, h);
ans += rem;
}
}
else if (sx - sy == h - w){
ans--;
if (sx < h){
ll rem = min(H - 1 - h, W - 1 - w);
ans += rem;
}
else{
ll rem = min(h, w);
ans += rem;
}
}
else{
ans -= 2;
}
return ans;
}
int main(){
ll T;
cin >> T;
while (T--){
ll H, W, sx, sy, h, w;
cin >> H >> W >> sx >> sy >> h >> w;
cout << solve(H, W, sx - 1, sy - 1, h - 1, w - 1) << endl;
}
}