Submission #56355
ソースコード
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 | // "header" {{{ #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> #include <string> #include <deque> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <cstring> #include <iomanip> #include <tuple> 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 long long #define setout(n,x) setw(n) << setfill(x) #define Fixed fixed << setprecision(10) const int INF = 0x3f3f3f3f; const long long LINF = 0x3f3f3f3f3f3f3f3fLL; const long long mod = 1000000007; 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 ); } inline double sqrt ( const double &x) { double xHalf = 0.5 * x; int64_t tmp = 0x5FE6EB50C7B537AAl - ( *(int64_t*)&x >> 1); double xRes = * ( double *)&tmp; xRes *= ( 1.5 - ( xHalf * xRes * xRes ) ); xRes *= ( 1.5 - ( xHalf * xRes * xRes ) ); xRes *= ( 1.5 - ( xHalf * xRes * xRes ) ); xRes *= ( 1.5 - ( xHalf * xRes * xRes ) ); return xRes * x; } // }}} //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 ; } }; //}}} int h,w,q; int dx[] = {1,0,-1,0}; int dy[] = {0,-1,0,1}; bool inside( int y, int x){ return (y < h && x < w && y >= 0 && x >= 0); } signed main(){ cin.tie(0); ios::sync_with_stdio( false ); cin >> h >> w >> q; UnionFind uf(h * w); vector<string> mas(h); vector<vector< int > > number(h,vector< int >(w)); int cnt = 0; rep(i,h){ cin >> mas[i]; rep(j,w){ number[i][j] = cnt; ++cnt; } } rep(i,h){ rep(j,w){ if (mas[i][j] == '#' ){ rep(k,4){ int ny = i + dy[k]; int nx = j + dx[k]; if (inside(ny,nx) && mas[ny][nx] == '#' ){ uf.unite(number[i][j],number[ny][nx]); } } } } } rep(loop,q){ int com,y,x; cin >> com >> y >> x; --y; --x; if (com){ cout << (mas[y][x] == '#' ? uf.size(number[y][x]) : 0) << '\n' ; } else { mas[y][x] = '#' ; rep(i,4){ int ny = y + dy[i]; int nx = x + dx[i]; if (inside(ny,nx) && mas[ny][nx] == '#' ){ uf.unite(number[y][x],number[ny][nx]); } } } } return 0; } |
ステータス
項目 | データ |
---|---|
問題 | 0971 - 島の創造 |
ユーザー名 | ei1903 |
投稿日時 | 2019-11-13 16:47:04 |
言語 | C++14 |
状態 | Accepted |
得点 | 10 |
ソースコード長 | 3035 Byte |
最大実行時間 | 337 ms |
最大メモリ使用量 | 82760 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | Easy | 1 / 1 | *easy, *sample* |
2 | ALL | 9 / 9 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # | |
---|---|---|---|---|---|
input-sample1 | AC | 44 ms | 604 KB |
1
|
2
|
input-sample2 | AC | 39 ms | 688 KB |
1
|
2
|
input01-easy | AC | 28 ms | 892 KB |
1
|
2
|
input02-easy | AC | 36 ms | 1036 KB |
1
|
2
|
input03-easy | AC | 21 ms | 1396 KB |
1
|
2
|
input04 | AC | 261 ms | 28140 KB |
2
|
|
input05 | AC | 153 ms | 30656 KB |
2
|
|
input06 | AC | 201 ms | 34144 KB |
2
|
|
input07 | AC | 236 ms | 39944 KB |
2
|
|
input08 | AC | 208 ms | 53168 KB |
2
|
|
input09 | AC | 231 ms | 60436 KB |
2
|
|
input10 | AC | 337 ms | 66808 KB |
2
|
|
input11 | AC | 211 ms | 76384 KB |
2
|
|
input12 | AC | 222 ms | 82760 KB |
2
|
|
input13 | AC | 29 ms | 58288 KB |
2
|
|
input14 | AC | 30 ms | 58240 KB |
2
|