結果
| 問題 |
No.440 2次元チワワ問題
|
| コンテスト | |
| ユーザー |
ytft
|
| 提出日時 | 2021-03-26 19:20:01 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 135 ms / 5,000 ms |
| コード長 | 2,761 bytes |
| コンパイル時間 | 1,895 ms |
| コンパイル使用メモリ | 183,704 KB |
| 実行使用メモリ | 7,424 KB |
| 最終ジャッジ日時 | 2024-11-28 16:19:32 |
| 合計ジャッジ時間 | 5,015 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
vector<vector<char>> spin(vector<vector<char>>& S){
int H=S.size();
int W=S[0].size();
vector<vector<char>> ret(W,vector<char>(H));
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
ret[W-1-j][i]=S[i][j];
}
}
return ret;
}
vector<long long> calc(vector<vector<char>>& S,vector<vector<int>>& query){
int H=S.size();
int W=S[0].size();
int Q=query.size();
vector<vector<int>> one(H,vector<int>(W));
vector<vector<int>> zero(H,vector<int>(W));
vector<vector<int>> w(H,vector<int>(W));
int temp=0;
for(int i=0;i<H;i++){
temp=0;
for(int j=0;j<W;j++){
if(S[i][j]=='w'){
temp++;
}
w[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-=2*w[i][j]-1;
}
one[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[i][j]*(w[i][j]-1);
}
zero[i][j]=temp;
}
}
long long x;
vector<long long> ans(Q);
vector<int> q;
for(int j=0;j<Q;j++){
q=query[j];
for(int i=q[0];i<=q[2];i++){
if(q[1]==0){
ans[j]+=zero[i][q[3]];
}else{
x=w[i][q[1]-1];
ans[j]+=(q[3]+1-q[1]-w[i][q[3]]+w[i][q[1]-1])*x*x;
ans[j]+=(one[i][q[3]]-one[i][q[1]-1])*x;
ans[j]+=(zero[i][q[3]]-zero[i][q[1]-1]);
}
}
}
return ans;
}
vector<vector<int>> spinquery(vector<vector<int>>& query,int H,int W){
int Q=query.size();
vector<vector<int>> ret(Q,vector<int>(4));
for(int i=0;i<Q;i++){
ret[i][0]=W-1-query[i][3];
ret[i][1]=query[i][0];
ret[i][2]=W-1-query[i][1];
ret[i][3]=query[i][2];
}
return ret;
}
int main(){
int H,W;
cin>>H>>W;
vector<vector<char>> S(H,vector<char>(W));
string s;
for(int i=0;i<H;i++){
cin>>s;
for(int j=0;j<W;j++){
S[i][j]=s[j];
}
}
int Q;
cin>>Q;
vector<vector<int>> query(Q,vector<int>(4));
for(int i=0;i<Q;i++){
for(int j=0;j<4;j++){
cin>>query[i][j];
query[i][j]--;
}
}
vector<long long> k(Q);
vector<long long> ans(Q);
for(int i=0;i<4;i++){
k=calc(S,query);
for(int j=0;j<Q;j++){
ans[j]+=k[j];
}
query=spinquery(query,H,W);
S=spin(S);
swap(H,W);
}
for(long long i:ans){
cout<<i/2<<endl;
}
}
ytft