結果

問題 No.2696 Sign Creation
ユーザー applejam
提出日時 2025-09-10 13:41:19
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,396 bytes
コンパイル時間 4,218 ms
コンパイル使用メモリ 201,432 KB
実行使用メモリ 10,240 KB
最終ジャッジ日時 2025-09-10 13:41:27
合計ジャッジ時間 7,582 ms
ジャッジサーバーID
(参考情報)
judge2 / judge
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 37 WA * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using mint = modint998244353;
using vi = vector<int>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vmi = vector<mint>;
using vvmi = vector<vmi>;
using vvvmi = vector<vvmi>;
#define all(a) (a).begin(), (a).end()
#define rep2(i, m, n) for (int i = (m); i < (n); ++i)
#define rep(i, n) rep2(i, 0, n)
#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)
#define drep(i, n) drep2(i, n, 0)
using p = pair<int, int>;

int main(){

    int h, w, n, d; cin >> h >> w >> n >> d;
    vector<vector<p>> mh(d);
    rep(i, d){
        int s = i+1;
        rep2(j, -s, s+1){
            mh[i].push_back({j, s-abs(j)});
            if(s-abs(j)!=0){
                mh[i].push_back({j, abs(j)-s});
            }
        }
    }
    vvi grid(h, vi(w, 0));
    rep(i, n){
        int x, y; cin >> x >> y;
        grid[x-1][y-1] = 1;
    }
    dsu ds(h*w);
    rep(i, h*w){
        int j = i/w, k = i%w;
        if(grid[j][k] == 0)continue;
        for(auto u : mh){
            for(auto v : u){
                int a = j+v.first, b = k + v.second;
                if(a < 0 || a >= h || b < 0 || b >= w)continue;
                if(grid[a][b] == 1){
                    ds.merge(i, a*w+b);
                }
            }
        }
    }
    int size = 0;
    for(auto v : ds.groups()){
        if(v.size() > 1)size++;
    }
    int ansa = size, ansb = size;

    rep(i, h*w){
        int j = i/w, k = i%w;
        set<int> mg;
        int dp = 0;
        if(grid[j][k] == 1)continue;
        for(auto u : mh){
            for(auto v : u){
                int a = j+v.first, b = k + v.second;
                if(a < 0 || a >= h || b < 0 || b >= w)continue;
                if(grid[a][b] == 1){
                    int l = ds.leader(a*w+b);
                    if(ds.size(a*w+b) == 1){
                        dp = 1;
                    }else{
                        mg.insert(l);
                    }
                }
            }
        }
        int tmp = size+dp;
        if(mg.size()>1)tmp -= mg.size()-1;
        ansa = min(ansa, tmp);
        ansb = max(ansb, tmp);
    }
    cout << ansa << " " << ansb << endl;
    return 0;
}
0