結果
| 問題 | No.3806 Crossword Key with Cropping (Easy) |
| ユーザー |
|
| 提出日時 | 2026-11-14 16:27:56 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 1,013 ms / 2,000 ms |
| + 223µs | |
| コード長 | 2,825 bytes |
| 記録 | |
| コンパイル時間 | 2,616 ms |
| コンパイル使用メモリ | 347,344 KB |
| 実行使用メモリ | 9,880 KB |
| 最終ジャッジ日時 | 2026-11-14 16:28:25 |
| 合計ジャッジ時間 | 27,630 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(void){
int h,w;
cin>>h>>w;
vector<string> s(h);
for(int i=0;i<h;i++){
cin>>s[i];
}
vector<array<int,2>>ans;
vector<vector<int>>imos(h+1,vector<int>(w+1,0));
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(s[i][j]=='.'){
if((i==0||s[i-1][j]=='#')&&(i!=h-1&&s[i+1][j]=='.')){
imos[i+1][j+1]=1;
}else if((j==0||s[i][j-1]=='#')&&(j!=w-1&&s[i][j+1]=='.')){
imos[i+1][j+1]=1;
}else if((i==0||s[i-1][j]=='#')&&(i==h-1||s[i+1][j]=='#')&&(j==0||s[i][j-1]=='#')&&(j==w-1||s[i][j+1]=='#')){
imos[i+1][j+1]=1;
}
}
}
}
vector<vector<int>>memo=imos;
for(int i=0;i<=h;i++){
for(int j=0;j<w;j++){
imos[i][j+1]+=imos[i][j];
}
}
for(int j=0;j<=w;j++){
for(int i=0;i<h;i++){
imos[i+1][j]+=imos[i][j];
}
}
// for(int i=0;i<=h;i++){
// for(int j=0;j<=w;j++){
// cout<<imos[i][j]<<" ";
// }
// cout<<endl;
// }
int q;
cin>>q;
while(q--){
int a,b,c,d;
cin>>a>>b>>c>>d;
a--,b--,c--,d--;
int ans=imos[c+1][d+1]-imos[c+1][b]-imos[a][d+1]+imos[a][b];
if(a==c&&b==d){
cout<<(s[a][b]=='.')<<endl;
continue;
}else if(a==c){
int i=a;
for(int j=b;j<=d;j++){
ans-=memo[i+1][j+1];
if(s[i][j]=='.'){
if((j==b||s[i][j-1]=='#')){
ans++;
}
}
}
}else if(b==d){
int j=b;
for(int i=a;i<=c;i++){
ans-=memo[i+1][j+1];
if(s[i][j]=='.'){
if((i==a||s[i-1][j]=='#')){
ans++;
}
}
}
}else{
auto check = [&](int i,int j){
ans-=memo[i+1][j+1];
if(s[i][j]=='.'){
if((i==a||s[i-1][j]=='#')&&(i!=c&&s[i+1][j]=='.')){
ans++;
}else if((j==b||s[i][j-1]=='#')&&(j!=d&&s[i][j+1]=='.')){
ans++;
}else if((i==a||s[i-1][j]=='#')&&(i==c||s[i+1][j]=='#')&&(j==b||s[i][j-1]=='#')&&(j==d||s[i][j+1]=='#')){
ans++;
}
}
};
for(int i=a;i<=c;i++){
check(i,b);
check(i,d);
}
for(int i=b+1;i<d;i++){
check(a,i);
check(c,i);
}
}
cout<<ans<<endl;
}
return 0;
}