結果
| 問題 |
No.977 アリス仕掛けの摩天楼
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-03-09 18:48:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,683 bytes |
| コンパイル時間 | 1,923 ms |
| コンパイル使用メモリ | 173,656 KB |
| 実行使用メモリ | 5,760 KB |
| 最終ジャッジ日時 | 2024-11-08 18:09:25 |
| 合計ジャッジ時間 | 3,240 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 WA * 2 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
typedef long long int ll;
typedef pair<ll, ll > pi;
typedef pair<pair<ll, ll >, ll > pii;
vector<ll > vec;
vector<vector<ll > > vec2;
ll MOD = 1000000007;
ll INF = 1145141919454519;
vector<vector<pi > > F;
vector<vector<pi > > B;
struct UnionFind{
//ご本体
vector<ll > tree;
//高さ
vector<ll > rank;
//グループごとのサイズ
vector<ll > size;
//定義
UnionFind(ll N) : tree(N), rank(N), size(N){
for(int i = 0; i < N; i++){
tree[i] = i;
rank[i] = 0;
size[i] = 1;
}
}
//どの根っこに属しているのか?さかのぼり続ける
int root(int x){
if(tree[x] == x){
return x;
}
//経路圧縮
return tree[x] = root(tree[x]);
}
//木と木を(高さが低い方に)くっつける
ll unite(int x, int y){
int tx = root(x);
int ty = root(y);
//xとyの根が同じならくっつけない
if(tx == ty){
return 0;
}
ll s = size[tx] + size[ty];
ll r = size[tx] * size[ty];
size[tx] = s;
size[ty] = s;
//tree[tx] = ty;
//高くない方にくっつけたい:効果がいまいちわからん
//下:ランク付けのつもり
if(rank[tx] < rank[ty]){
//小さい方を大きい方
//txの根が大きい方の根に更新
tree[tx] = ty;
}else{
tree[ty] = tx;
//つなげるときに同じ高さだったらつなげた後に高さを+1する
if(rank[tx] == rank[ty]){
rank[tx]++;
}
}
return r;
}
//同じ木に属しているか?根っこをさかのぼって調べてみる
bool same(int x, int y){
int tx = root(x);
int ty = root(y);
if(tx == ty){
return true;
}else{
return false;
}
}
//グループのサイズを返す
int FindSize(int x){
return size[root(x)];
}
};
int main() {
ll N;
cin >> N;
//初期化
UnionFind O(N);
for(ll i = 0; i < N-1; i++){
ll a, b;
cin >> a >> b;
O.unite(a, b);
}
if(N <= 3){
cout << "Bob" << endl;
return 0;
}
bool f = true;
for(ll i = 0; i < N; i++){
//cout << O.FindSize(i) << endl;
if(O.FindSize(i) < N){
f = false;
}
}
if(f == true){
cout << "Bob" << endl;
}else{
cout << "Alice" << endl;
}
}