Official
B - メッセージの転送 / Message Forwarding Editorial
by
B - メッセージの転送 / Message Forwarding Editorial
by
MtSaka
問題文通りにメッセージを転送していきます。既に受け取ったかどうかを持つ長さ \(N\) の配列 \(V\) を用意し、\(V_1=1\) それ以外は \(V_i=0\) と初期化します。メンバー \(i\) がメッセージを受け取るたびに \(V_i=1\) と更新してメッセージの転送が終わるまでシミュレーションしていきます。最後に \(V_i=1\) となる \(i\) の個数が答えとなります。
このシミュレーションは while 文で行えます。毎ループでは、既に受け取ったかどうかの判定をして受け取っているなら break し、そうでないなら一旦 \(P_i\) にメッセージを転送していきます。
実装例(C++)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> p(n);
for (auto& e : p) cin >> e;
for (auto& e : p) e--;
vector<int> vis(n, 0);
int now = 0;
while (!vis[now]) {
vis[now] = 1;
now = p[now];
}
cout << count(vis.begin(), vis.end(), 1) << endl;
}
posted:
last update:
