競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 040D

ABC040D

グラフとクエリがあるが,いずれも年に関して降順ソートする. ソートすることで,クエリ毎にUnion-find を作り直す必要が無くなり, 同じUnion-find を使いまわせる.
年が同じときは,クエリに答える方を,Union-find の merge より先に行う.

 

使っている記号


int main() {
  ll n, m, k, q;
  cin >> n >> m;
  UnionFind<ll> uf(2e5+10);


  vector<vector<pll>> road(2e5+10), query(2e5+10);
  rep(i,m){
    ll a,b,y; cin >> a >> b >> y;
    --a,--b;
    road[y].emplace_back(a,b);
  }


  cin >> q;
  rep(qi,q){
    ll v,w; cin >> v >> w;
    v--;
    query[w].emplace_back(qi,v);
  }


  vll ans(q);
  drep(y, 2e5+10) {
    for(auto [i,v]:query[y]){
      ans[i] = uf.size(v);
    }

    for(auto [a,b]:road[y]){
      uf.merge(a,b);
    }
   
  }

  rep(i,q){
    cout << ans[i] << endl;
  }
return 0;
}