結果
問題 | No.440 2次元チワワ問題 |
ユーザー |
![]() |
提出日時 | 2016-10-29 00:11:21 |
言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 26 |
コンパイルメッセージ
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 longtypedef 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 secondtemplate<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];//vint 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;}