結果

問題 No.2316 Freight Train
ユーザー GlinTFrauleinGlinTFraulein
提出日時 2023-05-26 21:36:55
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 487 ms / 2,000 ms
コード長 2,009 bytes
コンパイル時間 4,457 ms
コンパイル使用メモリ 263,900 KB
実行使用メモリ 8,064 KB
最終ジャッジ日時 2024-06-07 05:55:40
合計ジャッジ時間 16,857 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 475 ms
7,808 KB
testcase_04 AC 250 ms
5,760 KB
testcase_05 AC 176 ms
5,632 KB
testcase_06 AC 56 ms
5,376 KB
testcase_07 AC 389 ms
5,376 KB
testcase_08 AC 264 ms
7,936 KB
testcase_09 AC 344 ms
6,400 KB
testcase_10 AC 371 ms
5,760 KB
testcase_11 AC 326 ms
7,424 KB
testcase_12 AC 403 ms
7,040 KB
testcase_13 AC 484 ms
7,936 KB
testcase_14 AC 470 ms
7,936 KB
testcase_15 AC 472 ms
7,936 KB
testcase_16 AC 487 ms
7,936 KB
testcase_17 AC 479 ms
8,064 KB
testcase_18 AC 473 ms
7,936 KB
testcase_19 AC 474 ms
7,936 KB
testcase_20 AC 468 ms
8,064 KB
testcase_21 AC 472 ms
7,936 KB
testcase_22 AC 468 ms
7,936 KB
testcase_23 AC 424 ms
8,064 KB
testcase_24 AC 452 ms
8,064 KB
testcase_25 AC 434 ms
8,064 KB
testcase_26 AC 419 ms
7,936 KB
testcase_27 AC 322 ms
5,376 KB
testcase_28 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#include <atcoder/all>
 
#define elif else if
#define ll long long
#define vll vector<long long>
#define vec vector
#define embk emplace_back
#define rep(i, n) for (ll i = 0; i < n; i++)
#define rep3(i, n, k) for (ll i = k; i < n; i++)
#define all(a) a.begin(), a.end()
#define YNeos(bool) (bool ? "Yes" : "No")
 
using namespace std;
using namespace atcoder;
const ll INF = 1LL << 60;
const ll mod = 998244353;
const double pi = acos(-1);

struct UnionFind {
  vector<ll> root, size;
  
  //コンストラクタ(初期化処理)
  UnionFind(ll n) : root(n), size(n, 1) {
    for (int i = 0; i < n; i++) root[i] = i;
  }
  
  //xの根を求める
  ll getroot (ll x) {
    if (root.at(x) == x) return x;
    else return root.at(x) = getroot(root.at(x));  //経路圧縮
  }
  
  //xとyが同一グループか判定
  bool issame(ll x, ll y) {
    return (getroot(x) == getroot(y));
  }
  
  //xとyを繋げる
  void unite(ll x, ll y) {
    ll rootx = getroot(x), rooty = getroot(y);  //xとyの根を求める
    if (rootx == rooty) return;  //根が同じなら何もしない
    
    //union by size
    if (size.at(rootx) < size.at(rooty)) swap(rootx, rooty);  //サイズの大小を保障
    root.at(rooty) = rootx;
    size.at(rootx) += size.at(rooty);
    return;
  }

  //uniteを与えられたグラフに対して一気に行う
  void unite_graph(vector<ll> u, vector<ll> v) {
    for(int i = 0; i < u.size(); i++) unite(u[i], v[i]);
  }
  
  //xに含まれる頂点数を求める
  ll getsize(ll x) {
    return size.at(root.at(x));
  }
  
  //連結成分の数を求める
  ll getunion() {
    ll uni = 0;
    for (int i = 0; i < root.size(); i++) if (root.at(i) == i) uni++;
    return uni;
  }
  
};

int main() {
  ll n, q; cin >> n >> q;
  vll p(n); rep(i, n) cin >> p[i];

  UnionFind UF(n);
  rep(i, n) {
    if (p[i] != -1) UF.unite(i, p[i]-1);
  }
  
  rep(itr, q) {
    ll a, b; cin >> a >> b;
    cout << YNeos(UF.issame(a-1, b-1)) << endl;;
  }
}
0