結果
問題 | No.440 2次元チワワ問題 |
ユーザー | ytft |
提出日時 | 2021-03-26 19:20:01 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 124 ms / 5,000 ms |
コード長 | 2,761 bytes |
コンパイル時間 | 2,174 ms |
コンパイル使用メモリ | 182,340 KB |
実行使用メモリ | 7,424 KB |
最終ジャッジ日時 | 2024-05-06 10:20:53 |
合計ジャッジ時間 | 4,752 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 1 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 1 ms
5,376 KB |
testcase_07 | AC | 14 ms
5,376 KB |
testcase_08 | AC | 37 ms
5,376 KB |
testcase_09 | AC | 62 ms
5,992 KB |
testcase_10 | AC | 12 ms
5,376 KB |
testcase_11 | AC | 22 ms
5,376 KB |
testcase_12 | AC | 18 ms
5,376 KB |
testcase_13 | AC | 67 ms
6,144 KB |
testcase_14 | AC | 6 ms
5,376 KB |
testcase_15 | AC | 62 ms
6,272 KB |
testcase_16 | AC | 22 ms
5,376 KB |
testcase_17 | AC | 100 ms
7,296 KB |
testcase_18 | AC | 89 ms
7,296 KB |
testcase_19 | AC | 93 ms
7,424 KB |
testcase_20 | AC | 93 ms
7,296 KB |
testcase_21 | AC | 114 ms
7,296 KB |
testcase_22 | AC | 109 ms
7,296 KB |
testcase_23 | AC | 110 ms
7,296 KB |
testcase_24 | AC | 124 ms
7,296 KB |
testcase_25 | AC | 60 ms
7,296 KB |
ソースコード
#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; } }