結果
| 問題 |
No.2696 Sign Creation
|
| コンテスト | |
| ユーザー |
Tatsu_mr
|
| 提出日時 | 2024-03-23 00:26:23 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,564 ms / 2,500 ms |
| コード長 | 3,263 bytes |
| コンパイル時間 | 2,714 ms |
| コンパイル使用メモリ | 213,040 KB |
| 最終ジャッジ日時 | 2025-02-20 12:52:16 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
int n;
vector<int> par, siz;
UnionFind(int n_) : n(n_), par(n_, -1), siz(n_, 1) {}
int leader(int x) {
if (par[x] == -1) {
return x;
} else {
return par[x] = leader(par[x]);
}
}
bool same(int x, int y) {
return leader(x) == leader(y);
}
bool merge(int x, int y) {
x = leader(x);
y = leader(y);
if (x == y) {
return false;
}
if (siz[x] < siz[y]) {
swap(x, y);
}
par[y] = x;
siz[x] += siz[y];
return true;
}
int size(int x) {
return siz[leader(x)];
}
vector<vector<int>> groups() {
vector<vector<int>> member(n);
for (int i = 0; i < n; i++) {
member[leader(i)].push_back(i);
}
vector<vector<int>> result;
for (int i = 0; i < n; i++) {
if (member[i].size() > 0) {
result.push_back(member[i]);
}
}
return result;
}
};
int main() {
int h, w, n, d;
cin >> h >> w >> n >> d;
vector<int> x(n), y(n);
map<pair<int, int>, int> mp;
for (int i = 0; i < n; i++) {
cin >> x[i] >> y[i];
x[i]--;
y[i]--;
mp[{x[i], y[i]}] = i + 1;
}
UnionFind uf(h * w);
for (int i = 0; i < n; i++) {
int a = x[i], b = y[i];
for (int j = -d; j <= d; j++) {
for (int k = -d; k <= d; k++) {
if (abs(j) + abs(k) > d) {
continue;
}
int na = a + j, nb = b + k;
int id = mp[{na, nb}];
if (id > 0) {
uf.merge(w * a + b, w * na + nb);
}
}
}
}
set<int> s;
for (int i = 0; i < h * w; i++) {
int ld = uf.leader(i);
if (uf.size(ld) >= 2) {
s.insert(ld);
}
}
int sz = s.size();
//周りにある星座の種類数
int mx = 0, mn = 2000000000;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (mp[{i, j}] > 0) {
continue;
}
int now = sz;
set<int> tmp;
int seiza = 0, one = 0;
for (int k = -d; k <= d; k++) {
for (int l = -d; l <= d; l++) {
if (abs(k) + abs(l) > d) {
continue;
}
int ni = i + k, nj = j + l;
int id = mp[{ni, nj}];
if (id > 0) {
int si = x[id - 1], sj = y[id - 1];
tmp.insert(uf.leader(w * si + sj));
}
}
}
for (int star : tmp) {
if (uf.size(star) >= 2) {
seiza++;
} else {
one++;
}
}
if (seiza) {
now -= (seiza - 1);
} else if (one) {
now++;
}
mx = max(mx, now);
mn = min(mn, now);
}
}
cout << mn << " " << mx << endl;
}
Tatsu_mr