結果
| 問題 | No.3806 Crossword Key with Cropping (Easy) |
| ユーザー |
|
| 提出日時 | 2026-11-06 20:34:56 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 651 ms / 2,000 ms |
| + 820µs | |
| コード長 | 2,055 bytes |
| 記録 | |
| コンパイル時間 | 2,644 ms |
| コンパイル使用メモリ | 370,164 KB |
| 実行使用メモリ | 9,908 KB |
| 最終ジャッジ日時 | 2026-11-14 14:36:44 |
| 合計ジャッジ時間 | 21,909 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int H,W;
cin >> H >> W;
vector<string> S(H);
for(int i = 0; i < H; i++){
cin >> S[i];
}
vector key_sum(H+1,vector<array<int,16>>(W+1));
for(int i = 0; i < H; i++){
for(int j = 0; j < W; j++){
for(int k = 0; k < 16; k++){
const array<int,4> bits = {k % 2, (k / 2) % 2,(k / 4) % 2,k / 8};
if(S[i][j] == '.' && (
((bits[3] || j == 0 || S[i][j - 1] == '#') && !bits[1] && j < W - 1 && S[i][j + 1] == '.')||
((bits[0] || i == 0 || S[i - 1][j] == '#') && !bits[2] && i < H - 1 && S[i + 1][j] == '.')||
((bits[0] || i == 0 || S[i - 1][j] == '#') && (bits[3] || j == 0 || S[i][j - 1] == '#') && (bits[2] || i == H - 1 || S[i + 1][j] == '#') && (bits[1] || j == W - 1 || S[i][j + 1] == '#'))
)){
key_sum[i + 1][j + 1][k] = 1;
}else{
key_sum[i + 1][j + 1][k] = 0;
}
}
}
}
for(int i = 0; i <= H; i++){
for(int j = 0; j <= W; j++){
for(int k = 0; k < 16; k++){
if(i == 0 || j == 0){
key_sum[i][j][k] = 0;
}else{
key_sum[i][j][k] += key_sum[i - 1][j][k] + key_sum[i][j - 1][k] - key_sum[i - 1][j - 1][k];
}
}
}
}
auto range_sum = [&](int a, int b, int c, int d, int k){
if(a > c || b > d) return 0;
return key_sum[c + 1][d + 1][k]
- key_sum[c + 1][b][k]
- key_sum[a][d + 1][k]
+ key_sum[a][b][k];
};
int Q;
cin >> Q;
while(Q--){
int A,B,C,D;
cin >> A >> B >> C >> D;
A--; B--; C--; D--;
int ans = 0;
ans += range_sum(A + 1, B + 1, C - 1, D - 1, 0);
ans += range_sum(A, B + 1, A, D - 1, 1 | (4 * (A == C)));
ans += range_sum(A + 1, D, C - 1, D, 2 | (8 * (B == D)));
if(A != C) ans += range_sum(C, B + 1, C, D - 1, 4);
if(B != D) ans += range_sum(A + 1, B, C - 1, B, 8);
ans += range_sum(A, B, A, B, 9 | (2 * (B == D)) | (4 * (A == C)));
if(B != D) ans += range_sum(A, D, A, D, 3 | (4 * (A == C)));
if(A != C && B != D) ans += range_sum(C, D, C, D, 6);
if(A != C) ans += range_sum(C, B, C, B, 12 | (2 * (B == D)));
cout << ans << endl;
}
}