結果
問題 | No.2946 Puyo |
ユーザー | dyktr_06 |
提出日時 | 2024-11-18 04:02:08 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 31 ms / 2,000 ms |
コード長 | 3,460 bytes |
コンパイル時間 | 1,130 ms |
コンパイル使用メモリ | 87,428 KB |
実行使用メモリ | 10,368 KB |
最終ジャッジ日時 | 2024-11-18 04:02:15 |
合計ジャッジ時間 | 6,746 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 23 ms
10,268 KB |
testcase_04 | AC | 23 ms
10,240 KB |
testcase_05 | AC | 22 ms
10,112 KB |
testcase_06 | AC | 24 ms
10,368 KB |
testcase_07 | AC | 23 ms
10,112 KB |
testcase_08 | AC | 4 ms
5,248 KB |
testcase_09 | AC | 10 ms
5,504 KB |
testcase_10 | AC | 5 ms
5,248 KB |
testcase_11 | AC | 13 ms
6,656 KB |
testcase_12 | AC | 4 ms
5,248 KB |
testcase_13 | AC | 2 ms
5,248 KB |
testcase_14 | AC | 6 ms
5,248 KB |
testcase_15 | AC | 3 ms
5,248 KB |
testcase_16 | AC | 6 ms
5,248 KB |
testcase_17 | AC | 18 ms
7,040 KB |
testcase_18 | AC | 3 ms
5,248 KB |
testcase_19 | AC | 12 ms
5,248 KB |
testcase_20 | AC | 15 ms
5,376 KB |
testcase_21 | AC | 22 ms
6,784 KB |
testcase_22 | AC | 5 ms
5,248 KB |
testcase_23 | AC | 15 ms
5,248 KB |
testcase_24 | AC | 31 ms
7,680 KB |
testcase_25 | AC | 28 ms
7,040 KB |
testcase_26 | AC | 30 ms
7,552 KB |
testcase_27 | AC | 3 ms
5,248 KB |
testcase_28 | AC | 16 ms
6,656 KB |
testcase_29 | AC | 22 ms
8,192 KB |
testcase_30 | AC | 14 ms
5,888 KB |
testcase_31 | AC | 19 ms
7,296 KB |
testcase_32 | AC | 19 ms
7,168 KB |
testcase_33 | AC | 17 ms
6,784 KB |
testcase_34 | AC | 23 ms
8,320 KB |
testcase_35 | AC | 21 ms
7,424 KB |
testcase_36 | AC | 22 ms
7,680 KB |
testcase_37 | AC | 24 ms
8,064 KB |
testcase_38 | AC | 17 ms
6,656 KB |
testcase_39 | AC | 16 ms
6,528 KB |
testcase_40 | AC | 10 ms
5,376 KB |
testcase_41 | AC | 20 ms
7,808 KB |
testcase_42 | AC | 19 ms
7,296 KB |
testcase_43 | AC | 16 ms
6,528 KB |
testcase_44 | AC | 19 ms
7,296 KB |
testcase_45 | AC | 16 ms
6,400 KB |
testcase_46 | AC | 10 ms
5,376 KB |
testcase_47 | AC | 15 ms
6,400 KB |
ソースコード
#include <iostream> #include <vector> #include <string> #include <algorithm> struct GridUnionFind{ struct UnionFind{ std::vector<int> par; UnionFind(){} void init(int N){ par.resize(N); for(int i = 0; i < N; ++i){ par[i] = -1; } } int root(int x){ if(par[x] < 0) return x; return par[x] = root(par[x]); } void unite(int x, int y){ int rx = root(x); int ry = root(y); if(rx == ry){ return; } if(-par[rx] < -par[ry]) std::swap(rx, ry); par[rx] = par[rx] + par[ry]; par[ry] = rx; } bool same(int x, int y){ int rx = root(x); int ry = root(y); return rx == ry; } long long size(int x){ return -par[root(x)]; } }; std::vector<std::string> grid; int h, w; UnionFind uf; char empty = '$'; GridUnionFind(int _h, int _w) : h(_h), w(_w){ grid = std::vector<std::string>(h, std::string(w, empty)); uf.init(h * w); } GridUnionFind(std::vector<std::string> &s){ grid = s; h = s.size(), w = s[0].size(); uf.init(h * w); } int id(int x, int y){ return x * w + y; } bool check(int x, int y){ return (std::clamp(x, 0, h - 1) == x && std::clamp(y, 0, w - 1) == y); } void build(){ std::vector<std::pair<int, int>> d = { {0, 1}, {1, 0} }; for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ for(auto &[dx, dy] : d){ int tx = i + dx, ty = j + dy; if(check(tx, ty)){ if(grid[i][j] == grid[tx][ty] && grid[i][j] != empty){ uf.unite(id(i, j), id(tx, ty)); } } } } } } std::pair<int, int> root(int x, int y){ int r = uf.root(id(x, y)); return {r / w, r % w}; } bool same(int x1, int y1, int x2, int y2){ if(!check(x1, y1) || !check(x2, y2)){ return false; } return uf.same(id(x1, y1), id(x2, y2)); } void update(int x, int y, char c){ if(!check(x, y) || grid[x][y] != empty){ return; } std::vector<std::pair<int, int>> d = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; grid[x][y] = c; for(auto &[dx, dy] : d){ int tx = x + dx, ty = y + dy; if(check(tx, ty)){ if(grid[x][y] == grid[tx][ty] && grid[x][y] != empty){ uf.unite(id(x, y), id(tx, ty)); } } } } long long size(int x, int y){ return uf.size(id(x, y)); } }; using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int h, w; cin >> h >> w; vector<string> s(h); for(int i = 0; i < h; ++i){ cin >> s[i]; } GridUnionFind guf(s); guf.build(); vector<string> ans = s; for(int i = 0; i < h; ++i){ for(int j = 0; j < w; ++j){ if(guf.size(i, j) >= 4) ans[i][j] = '.'; } } for(auto &x : ans){ cout << x << endl; } }