結果
| 問題 |
No.13 囲みたい!
|
| コンテスト | |
| ユーザー |
cureskol
|
| 提出日時 | 2020-03-27 11:22:14 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,533 bytes |
| コンパイル時間 | 1,302 ms |
| コンパイル使用メモリ | 166,784 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2025-01-02 08:29:23 |
| 合計ジャッジ時間 | 2,063 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int d[100][100];
//BEGIN CUT HERE
struct UnionFind{
int num;//連結成分の数
vector<int> r,p;//そのグループのサイズ,自分の親っぽいやつ
UnionFind(){}
UnionFind(int n):num(n),r(n,1),p(n,0){iota(p.begin(),p.end(),0);}
int find(int x){//どのグループに所属するか
return (x==p[x]?x:p[x]=find(p[x]));//xがグループの名前と一致するまでxを親にする
}
bool same(int x,int y){//同じグループかどうか
return find(x)==find(y);
}
void unite(int x,int y){//xとyを同じグループにする
x=find(x);y=find(y);//xとyのグループの名前をどっちかが変える
if(x==y) return;
if(r[x]<r[y]) swap(x,y);//サイズが大きい方をxとする
r[x]+=r[y];//yの親をxにする(今までyだったグループ名がxになる)
p[y]=x;
num--;
}
int size(int x){//グループの大きさ
return r[find(x)];
}
int count() const{//グループの数
return num;
}
};
//END CUT HERE
template<typename T>
void fin(T a){
cout<<a<<endl;
exit(0);
}
signed main(){
int w,h;cin>>w>>h;
for(int i=0;i<h;i++)for(int j=0;j<w;j++)cin>>d[i][j];
UnionFind uf(10000);
for(int i=1;i<h;i++)for(int j=0;j<w;j++)if(d[i][j]==d[i-1][j])uf.unite(i*w+j,(i-1)*w+j);
for(int j=1;j<w;j++){
for(int i=0;i<h;i++){
if(d[i][j]!=d[i][j-1])continue;
if(uf.same(i*w+j,i*w+j-1))fin("possible");
uf.unite(i*w+j,i*w+j-1);
}
}
fin("impossible");
}
cureskol