結果
問題 | No.440 2次元チワワ問題 |
ユーザー | latte0119 |
提出日時 | 2016-10-29 00:11:21 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 166 ms / 5,000 ms |
コード長 | 3,380 bytes |
コンパイル時間 | 1,819 ms |
コンパイル使用メモリ | 160,524 KB |
実行使用メモリ | 17,024 KB |
最終ジャッジ日時 | 2024-11-24 06:47:32 |
合計ジャッジ時間 | 3,304 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 3 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 4 ms
5,888 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 3 ms
5,248 KB |
testcase_07 | AC | 9 ms
7,296 KB |
testcase_08 | AC | 27 ms
13,184 KB |
testcase_09 | AC | 48 ms
16,384 KB |
testcase_10 | AC | 17 ms
14,592 KB |
testcase_11 | AC | 10 ms
5,248 KB |
testcase_12 | AC | 14 ms
10,368 KB |
testcase_13 | AC | 44 ms
14,080 KB |
testcase_14 | AC | 3 ms
5,248 KB |
testcase_15 | AC | 43 ms
15,104 KB |
testcase_16 | AC | 7 ms
5,248 KB |
testcase_17 | AC | 61 ms
16,896 KB |
testcase_18 | AC | 53 ms
17,024 KB |
testcase_19 | AC | 64 ms
16,896 KB |
testcase_20 | AC | 58 ms
16,896 KB |
testcase_21 | AC | 143 ms
16,768 KB |
testcase_22 | AC | 151 ms
16,768 KB |
testcase_23 | AC | 137 ms
17,024 KB |
testcase_24 | AC | 166 ms
16,896 KB |
testcase_25 | AC | 153 ms
16,896 KB |
コンパイルメッセージ
main.cpp: In function ‘void query()’: main.cpp:38:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 38 | scanf("%lld%lld%lld%lld",&y,&x,&yy,&xx); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ main.cpp: In function ‘int main()’: main.cpp:66:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 66 | scanf("%lld%lld",&H,&W); | ~~~~~^~~~~~~~~~~~~~~~~~ main.cpp:67:18: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 67 | rep(i,H)scanf("%s",fld[i]); | ~~~~~^~~~~~~~~~~~~ main.cpp:127:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 127 | scanf("%lld",&Q); | ~~~~~^~~~~~~~~~~
ソースコード
#include<bits/stdc++.h> using namespace std; #define int long long typedef vector<int>vint; typedef pair<int,int>pint; typedef vector<pint>vpint; #define rep(i,n) for(int i=0;i<(n);i++) #define reps(i,f,n) for(int i=(f);i<(n);i++) #define all(v) (v).begin(),(v).end() #define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++) #define pb push_back #define fi first #define se second template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;} template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;} int H,W; char fld[555][555]; int sumC[555][555]; int val[555][555]; int P[555][555];//-> int Q[555][555];//<- int R[555][555];//v int S[555][555];//^ inline int fC(int a,int b,int c,int d){ return sumC[c][d]-sumC[c][b]-sumC[a][d]+sumC[a][b]; } inline int fW(int a,int b,int c,int d){ return (c-a)*(d-b)-fC(a,b,c,d); } void query(){ int y,x,yy,xx; scanf("%lld%lld%lld%lld",&y,&x,&yy,&xx); y--;x--; int ans=val[yy][xx]-val[yy][x]-val[y][xx]+val[y][x]; for(int i=y;i<yy;i++){ int w=fW(i,x,i+1,xx); ans-=fC(i,0,i+1,x)*w*fW(i,xx,i+1,W); ans-=fW(i,0,i+1,x)*w*fC(i,xx,i+1,W); ans-=(P[i][x]-P[i][xx]-fC(i,x,i+1,xx)*fW(i,xx,i+1,W))*fW(i,xx,i+1,W); ans-=(Q[i][xx]-Q[i][x]-fC(i,x,i+1,xx)*fW(i,0,i+1,x))*fW(i,0,i+1,x); ans-=fC(i,0,i+1,x)*w*(w-1)/2; ans-=fC(i,xx,i+1,W)*w*(w-1)/2; } for(int j=x;j<xx;j++){ int w=fW(y,j,yy,j+1); ans-=fC(0,j,y,j+1)*w*fW(yy,j,H,j+1); ans-=fW(0,j,y,j+1)*w*fC(yy,j,H,j+1); ans-=(R[y][j]-R[yy][j]-fC(y,j,yy,j+1)*fW(yy,j,H,j+1))*fW(yy,j,H,j+1); ans-=(S[yy][j]-S[y][j]-fC(y,j,yy,j+1)*fW(0,j,y,j+1))*fW(0,j,y,j+1); ans-=fC(0,j,y,j+1)*w*(w-1)/2; ans-=fC(yy,j,H,j+1)*w*(w-1)/2; } printf("%lld\n",ans); } signed main(){ scanf("%lld%lld",&H,&W); rep(i,H)scanf("%s",fld[i]); for(int i=0;i<H;i++){ int cnt=0; for(int j=W-1;j>=0;j--){ if(fld[i][j]=='w')cnt++; else{ P[i][j]=cnt; } P[i][j]+=P[i][j+1]; } cnt=0; for(int j=0;j<W;j++){ if(fld[i][j]=='w')cnt++; else{ Q[i][j+1]=cnt; } Q[i][j+1]+=Q[i][j]; } } for(int j=0;j<W;j++){ int cnt=0; for(int i=H-1;i>=0;i--){ if(fld[i][j]=='w')cnt++; else{ R[i][j]=cnt; } R[i][j]+=R[i+1][j]; } cnt=0; for(int i=0;i<H;i++){ if(fld[i][j]=='w')cnt++; else{ S[i+1][j]=cnt; } S[i+1][j]+=S[i][j]; } } rep(i,H){ rep(j,W){ sumC[i+1][j+1]=fld[i][j]=='c'; sumC[i+1][j+1]+=sumC[i][j+1]+sumC[i+1][j]-sumC[i][j]; } } rep(i,H){ rep(j,W){ if(fld[i][j]=='w'){ val[i+1][j+1]+=fC(0,j,i,j+1)*fW(i+1,j,H,j+1); val[i+1][j+1]+=fC(i+1,j,H,j+1)*fW(0,j,i,j+1); val[i+1][j+1]+=fC(i,0,i+1,j)*fW(i,j+1,i+1,W); val[i+1][j+1]+=fC(i,j+1,i+1,W)*fW(i,0,i+1,j); } val[i+1][j+1]+=val[i][j+1]+val[i+1][j]-val[i][j]; } } int Q; scanf("%lld",&Q); while(Q--){ query(); } return 0; }