結果

問題 No.440 2次元チワワ問題
ユーザー latte0119latte0119
提出日時 2016-10-29 00:11:21
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 177 ms / 5,000 ms
コード長 3,380 bytes
コンパイル時間 1,394 ms
コンパイル使用メモリ 160,516 KB
実行使用メモリ 17,024 KB
最終ジャッジ日時 2024-05-03 08:25:01
合計ジャッジ時間 3,800 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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 2 ms
5,376 KB
testcase_04 AC 4 ms
5,760 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 3 ms
5,376 KB
testcase_07 AC 10 ms
7,424 KB
testcase_08 AC 29 ms
13,312 KB
testcase_09 AC 54 ms
16,512 KB
testcase_10 AC 17 ms
14,464 KB
testcase_11 AC 10 ms
5,376 KB
testcase_12 AC 15 ms
10,624 KB
testcase_13 AC 51 ms
14,080 KB
testcase_14 AC 3 ms
5,376 KB
testcase_15 AC 49 ms
15,104 KB
testcase_16 AC 7 ms
5,376 KB
testcase_17 AC 79 ms
17,024 KB
testcase_18 AC 66 ms
16,896 KB
testcase_19 AC 72 ms
16,896 KB
testcase_20 AC 71 ms
17,024 KB
testcase_21 AC 163 ms
17,024 KB
testcase_22 AC 177 ms
17,024 KB
testcase_23 AC 143 ms
16,896 KB
testcase_24 AC 175 ms
16,896 KB
testcase_25 AC 168 ms
17,024 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);
      |     ~~~~~^~~~~~~~~~~

ソースコード

diff #

#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;
}
0