AtCoder Regular Contest #025 B問題 - チョコレート

Source

AtCoder Regular Contest #025
問題文

問題概要

$H \times W$ のマス目に分割されている板チョコがある.
市松模様に,ブラックチョコレートと,ミルクチョコレートが配置されている.(問題文の図を参照)
また,それぞれのマスのチョコレートの濃度 $C_{ij}$ が与えられる.
長方形の領域で,ブラックチョコレートの濃度の総和と,ミルクチョコレートの濃度の総和が一致するものの中で,面積最大のものの面積を求める問題.
存在しないなら求める面積は $0$ となる.

解法

ブラックチョコレートの濃度を $-1$ 倍しておいて,和が $0$ になるところを探せば良い.
累積和+包除原理を用いて,各長方形の部分に含まれる濃度の和を $O(1)$ で求められるようにしておいて,全ての長方形に対して試せば良い.
時間計算量は $O(H^2 W^2)$.

C++によるスパゲッティなソースコード

#include<bits/stdc++.h>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define mygc(c) (c)=getchar_unlocked()
#define mypc(c) putchar_unlocked(c)

void reader(int *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
void reader(int *x, int *y){reader(x);reader(y);}
void writer(int x, char c){int i,sz=0,m=0;char buf[10];if(x<0)m=1,x=-x;while(x)buf[sz++]=x%10,x/=10;if(!sz)buf[sz++]=0;if(m)mypc('-');while(sz--)mypc(buf[sz]+'0');mypc(c);}

int X, Y, C[120][120];
int sum[120][120];

int main(){
  int i, j, k;
  int x1, y1, x2, y2, res = 0;

  reader(&X,&Y);
  rep(i,X) rep(j,Y) reader(C[i]+j);
  rep(i,X) rep(j,Y) if((i+j)%2) C[i][j] = -C[i][j];

  rep(i,X+1) rep(j,Y+1) sum[i][j] = 0;
  rep(i,X) rep(j,Y) sum[i+1][j+1] = sum[i+1][j] + sum[i][j+1] - sum[i][j] + C[i][j];

  rep(x1,X) rep(y1,Y) REP(x2,x1,X) REP(y2,y1,Y){
    if(sum[x2+1][y2+1] - sum[x2+1][y1] - sum[x1][y2+1] + sum[x1][y1]) continue;
    res = max(res, (x2-x1+1)*(y2-y1+1));
  }

  writer(res, '\n');

  return 0;
}

Current time: 2017年11月18日11時41分56秒
Last modified: 2014年08月06日02時01分38秒 (by laycrs)
Tags: Competitive_Programming AtCoder AtCoder_Regular_Contest ARC025 ARC_B
トップページに戻る

Logged in as: unknown user (not login)

ログイン: