公式

B - 倉庫の荷物管理 / Warehouse Inventory Management 解説 by physics0523


倉庫 \(k\) にある荷物の重さの合計を配列 \(v\) を用いて管理することを考えます。

この問題で行われる操作は以下の \(2\) 通りです。操作を配列に対する演算に言い換えると以下の通りになります。

  • 倉庫 \(a\) にある荷物を全て倉庫 \(b\) に移動させる
    • まず、 \(v[b]\)\(v[a]\) を加算します。
    • 次に、 \(v[a]\)\(0\) にする。
  • 倉庫 \(c\) にある荷物の重さの合計を答える
    • 単に \(v[c]\) を答えればよいです。

時間計算量は \(O(N+Q)\) 、空間計算量は \(O(N)\) です。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int main(){
  ll n,q;
  cin >> n >> q;
  vector<ll> v(n+1);
  for(ll i=1;i<=n;i++){ cin >> v[i]; }
  while(q--){
    ll typ;
    cin >> typ;
    if(typ==1){
      ll a,b;
      cin >> a >> b;
      v[b]+=v[a];
      v[a]=0;
    }
    else{
      ll c;
      cin >> c;
      cout << v[c] << "\n";
    }
  }
  return 0;
}

投稿日時:
最終更新: