結果
| 問題 |
No.440 2次元チワワ問題
|
| コンテスト | |
| ユーザー |
ytft
|
| 提出日時 | 2021-03-26 14:48:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,093 bytes |
| コンパイル時間 | 2,254 ms |
| コンパイル使用メモリ | 189,568 KB |
| 実行使用メモリ | 17,408 KB |
| 最終ジャッジ日時 | 2024-11-28 03:08:22 |
| 合計ジャッジ時間 | 48,437 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 11 WA * 4 RE * 6 TLE * 5 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int calc_line(int start,int end,vector<int> cero,vector<int> un,vector<int> c_count,vector<int> w_count){
int a2,a1,a0;
int x=0;
a2=c_count[end];
a1=-un[end];
a0=cero[end];
if(start!=0){
a2-=c_count[start-1];
a1-=-un[start-1];
a0-=cero[start-1];
x=w_count[start-1];
}
return a2*x*x+a1*x+a0;
}
vector<int> calc(vector<vector<char>> S,int H,int W,int Q,vector<vector<int>> query){
vector<vector<int>> c_count(H,vector<int>(W));
vector<vector<int>> w_count(H,vector<int>(W));
int temp;
for(int i=0;i<H;i++){
temp=0;
for(int j=0;j<W;j++){
temp+=(S[i][j]=='c');
c_count[i][j]=temp;
w_count[i][j]=j+1-temp;
}
}
vector<vector<int>> un(H,vector<int>(W));
vector<vector<int>> cero(H,vector<int>(W));
for(int i=0;i<H;i++){
temp=0;
for(int j=0;j<W;j++){
if(S[i][j]=='c')temp+=(2*w_count[i][j]-1);
un[i][j]=temp;
}
}
for(int i=0;i<H;i++){
temp=0;
for(int j=0;j<W;j++){
if(S[i][j]=='c')temp+=w_count[i][j]*(w_count[i][j]-1);
cero[i][j]=temp;
}
}
vector<int> ret(0);
int m,n,x,a2,a1,a0;
for(vector<int> q:query){
temp=0;
for(int j=q[0];j<=q[2];j++){
temp+=calc_line(q[1],q[3],cero[j],un[j],c_count[j],w_count[j]);
}
ret.push_back(temp);
}
return ret;
}
int main(){
int H,W;
cin>>H>>W;
vector<vector<vector<char>>> S(4,vector<vector<char>>(H,vector<char>(W)));
S[1].resize(W,vector<char>(H));
S[3].resize(W,vector<char>(H));
string line;
for(int i=0;i<H;i++){
cin>>line;
for(int j=0;j<W;j++){
S[0][i][j]=line[j];
}
}
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
S[2][H-1-i][W-1-j]=S[0][i][j];
S[1][W-1-j][i]=S[0][i][j];
S[3][j][H-1-i]=S[0][i][j];
}
}
int Q;
cin>>Q;
vector<vector<vector<int>>> query(4,vector<vector<int>>(Q,vector<int>(4)));
vector<vector<int>> nextQuery(Q,vector<int>(4));
vector<int> temp(4);
for(int i=0;i<Q;i++){
for(int j=0;j<4;j++){
cin>>temp[j];
}
for(int j=0;j<4;j++)query[0][i][j]=temp[j]-1;
query[1][i][0]=W-1-(temp[3]-1);
query[1][i][1]=temp[0]-1;
query[1][i][2]=W-1-(temp[1]-1);
query[1][i][3]=temp[2]-1;
query[2][i][0]=H-1-(temp[2]-1);
query[2][i][1]=W-1-(temp[3]-1);
query[2][i][2]=H-1-(temp[0]-1);
query[2][i][3]=W-1-(temp[1]-1);
query[3][i][0]=temp[1]-1;
query[3][i][1]=H-1-(temp[2]-1);
query[3][i][2]=temp[3]-1;
query[3][i][3]=H-1-(temp[0]-1);
}
vector<vector<int>> answers(4,vector<int>(Q));
for(int i=0;i<4;i++){
answers[i]=calc(S[i],H,W,Q,query[i]);
swap(H,W);
}
for(int i=0;i<Q;i++){
cout<<(answers[0][i]+answers[1][i]+answers[2][i]+answers[3][i])/2<<endl;
}
}
ytft