結果

問題 No.2456 Stamp Art
ユーザー milanis48663220
提出日時 2023-09-01 22:45:14
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 3,766 bytes
コンパイル時間 1,207 ms
コンパイル使用メモリ 121,484 KB
最終ジャッジ日時 2025-02-16 17:04:42
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 8 WA * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <tuple>
#include <cmath>
#include <numeric>
#include <functional>
#include <cassert>
#define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl;
#define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
typedef long long ll;
template<typename T>
vector<vector<T>> vec2d(int n, int m, T v){
return vector<vector<T>>(n, vector<T>(m, v));
}
template<typename T>
vector<vector<vector<T>>> vec3d(int n, int m, int k, T v){
return vector<vector<vector<T>>>(n, vector<vector<T>>(m, vector<T>(k, v)));
}
template<typename T>
void print_vector(vector<T> v, char delimiter=' '){
if(v.empty()) {
cout << endl;
return;
}
for(int i = 0; i+1 < v.size(); i++) cout << v[i] << delimiter;
cout << v.back() << endl;
}
template<typename T>
class CumsumGrid{
public:
CumsumGrid(vector<vector<T>> v): v(v){
n = v.size();
m = v[0].size();
v_cumsum = vector<vector<T>>(n+1, vector<T>(m+1, T(0)));
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++){
v_cumsum[i+1][j+1] = v_cumsum[i+1][j]+v_cumsum[i][j+1]-v_cumsum[i][j]+v[i][j];
}
}
}
/**
* sum(v[il:ir)[jl:jr))
*/
T sum(int il, int ir, int jl, int jr){
if(ir <= il) return T(0);
if(jr <= jl) return T(0);
if(ir > n) ir = n;
if(jr > m) jr = m;
if(il < 0) il = 0;
if(jl < 0) jl = 0;
return v_cumsum[ir][jr]-v_cumsum[ir][jl]-v_cumsum[il][jr]+v_cumsum[il][jl];
}
private:
int n, m;
vector<vector<T>> v;
vector<vector<T>> v_cumsum;
};
int imos[2005][2005];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << setprecision(10) << fixed;
int h, w; cin >> h >> w;
vector<string> s(h);
for(int i = 0; i < h; i++) cin >> s[i];
auto c = vec2d(h, w, 0);
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
if(s[i][j] == '.') c[i][j] = 1;
}
}
auto cumsum = CumsumGrid<int>(c);
auto clear = [&](){
for(int i = 0; i <= h; i++){
for(int j = 0; j <= w; j++){
imos[i][j] = 0;
}
}
};
auto ok = [&](int len){
for(int i = 0; i+len <= h; i++){
for(int j = 0; j+len <= w; j++){
if(cumsum.sum(i, i+len, j, j+len) == 0){
imos[i][j]++;
imos[i+len][j]--;
imos[i][j+len]--;
imos[i+len][j+len]++;
}
}
}
for(int i = 0; i < h; i++){
for(int j = 1; j <= w; j++){
imos[i][j] += imos[i][j-1];
}
}
for(int i = 1; i <= h; i++){
for(int j = 0; j < w; j++){
imos[i][j] += imos[i-1][j];
}
}
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++){
bool black = s[i][j] == '#';
bool cur_black = imos[i][j] > 0;
if(black != cur_black) return false;
}
}
return true;
};
int l = 1, r = min(h, w);
if(ok(r)){
cout << r << endl;
return 0;
}
while(r-l > 1){
int len = (l+r)/2;
if(ok(len)) l = len;
else r = len;
}
cout << l << endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0