Submission #58258
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | // "header" {{{ #include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <string> #include <map> #include <unordered_map> #include <queue> #include <stack> #include <deque> #include <set> #include <list> #include <tuple> #include <iomanip> #include <climits> using namespace std; #define rep(i,n) for(int i=0;i<(n);++i) #define reps(i,n) for(int i=1;i<=(n);++i) #define all(x) (x).begin(),(x).end() #define pii pair<int,int> #define int int64_t #define Fixed fixed << setprecision(10) #define moke_pair make_pair constexpr int INF = 0x3f3f3f3f; constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL; constexpr long long mod1 = 1000000007; constexpr long long mod2 = 998244353; constexpr int dx[] = {1,0,-1,0,1,1,-1,-1}; constexpr int dy[] = {0,-1,0,1,1,-1,-1,1}; template < class A, class B> inline bool chmax(A &a, const B &b) { return b > a && (a = b, true ); } template < class A, class B> inline bool chmin(A &a, const B &b) { return b < a && (a = b, true ); } template < class T> using min_heap = priority_queue<T,vector<T>,greater<T> >; template < class T> using max_heap = priority_queue<T>; template < class T, class U> using umap = unordered_map<T,U>; inline int64_t updiv(int64_t n,int64_t d){ return ((n + d -1) / d); } inline int square( int a){ return a * a; } // }}} //UnionFind{{{ struct UnionFind { vector < int > par; vector < int > siz; UnionFind( int n): par(n), siz(n, 1) { //初期化 for ( int i = 0; i < n; i++) par[i] = i; } int root( int x){ //根の更新+判定 if (par[x] == x) return x; else return par[x] = root(par[x]); } int size( int x){ //サイズ return siz[root(x)]; } bool same( int x, int y){ //グループの判定 return root(x) == root(y); } bool unite( int x, int y){ //つなげる if ((x=root(x))==(y=root(y))) return false ; if ( siz[y] > siz[x] ) swap(x,y); siz[x] += siz[y]; par[y] = x; return true ; } }; //}}} signed main(){ cin.tie(0); ios::sync_with_stdio( false ); int h,w,q; cin >> h >> w >> q; UnionFind uf(h*w+1); vector<vector< int > > num(h,vector< int >(w)); vector<string> mat(h); int cnt = 0; rep(i,h){ cin >> mat[i]; rep(j,w){ num[i][j] = cnt; ++cnt; } } auto inside = [&]( int y, int x){ return (y < h && x < w && y >= 0 && x >= 0); }; vector<vector< bool > > visited(h,vector< bool >(w)); rep(i,h){ rep(j,w){ if (visited[i][j] || mat[i][j] == '.' ) continue ; queue<pii> que; que.emplace(i,j); while (!que.empty()){ int y,x; tie(y,x) = que.front(); que.pop(); rep(k,4){ int ny = y + dy[k]; int nx = x + dx[k]; if (inside(ny,nx) && mat[ny][nx] == '#' && !visited[ny][nx]){ visited[ny][nx] = true ; que.emplace(ny,nx); uf.unite(num[y][x],num[ny][nx]); } } } } } rep(i,q){ int com,y,x; cin >> com >> y >> x; --y,--x; if (com){ cout << (mat[y][x] == '#' ? uf.size(num[y][x]) : 0) << '\n' ; } else { rep(j,4){ int ny = y + dy[j]; int nx = x + dx[j]; if (inside(ny,nx) && mat[ny][nx] == '#' ){ uf.unite(num[y][x],num[ny][nx]); } } mat[y][x] = '#' ; } } return 0; } |
ステータス
項目 | データ |
---|---|
問題 | 0971 - 島の創造 |
ユーザー名 | ei1903 |
投稿日時 | 2020-01-24 17:50:11 |
言語 | C++14 |
状態 | Accepted |
得点 | 10 |
ソースコード長 | 3795 Byte |
最大実行時間 | 337 ms |
最大メモリ使用量 | 36496 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | Easy | 1 / 1 | *easy, *sample* |
2 | ALL | 9 / 9 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # | |
---|---|---|---|---|---|
input-sample1 | AC | 30 ms | 604 KB |
1
|
2
|
input-sample2 | AC | 24 ms | 684 KB |
1
|
2
|
input01-easy | AC | 18 ms | 1020 KB |
1
|
2
|
input02-easy | AC | 29 ms | 904 KB |
1
|
2
|
input03-easy | AC | 21 ms | 1248 KB |
1
|
2
|
input04 | AC | 218 ms | 23376 KB |
2
|
|
input05 | AC | 151 ms | 22540 KB |
2
|
|
input06 | AC | 209 ms | 21528 KB |
2
|
|
input07 | AC | 203 ms | 22448 KB |
2
|
|
input08 | AC | 201 ms | 30036 KB |
2
|
|
input09 | AC | 232 ms | 31360 KB |
2
|
|
input10 | AC | 337 ms | 32052 KB |
2
|
|
input11 | AC | 242 ms | 35948 KB |
2
|
|
input12 | AC | 167 ms | 36496 KB |
2
|
|
input13 | AC | 19 ms | 11852 KB |
2
|
|
input14 | AC | 23 ms | 11936 KB |
2
|