結果
問題 |
No.2696 Sign Creation
|
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#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; }