412. Sislovesme Now
long long ans = 0; // up to N/2 fits in int, but long long is safe for (int i = 1; i <= N; ++i) int j = love[i]; if (i < j && love[j] == i) ++ans; // count each 2‑cycle once cout << ans << '\n'; return 0;
From Lemma 1 every increment corresponds to a genuine mutual‑love pair. From Lemma 2 every genuine pair contributes exactly one increment. From Lemma 3 no non‑mutual pair contributes any increment. Therefore the total number of increments equals precisely the number of mutual‑love pairs. ∎ 5️⃣ Complexity analysis Time – The loop visits each of the N people once, performing O(1) work per iteration: O(N) per test case.
int main() ios::sync_with_stdio(false); cin.tie(nullptr); int T; if (!(cin >> T)) return 0; while (T--) int N; cin >> N; vector<int> love(N + 1); // 1‑based for (int i = 1; i <= N; ++i) cin >> love[i];
love[i] = j and love[j] = i . Your task is to count how many mutual‑love pairs exist in the given group. 412. Sislovesme
Memory – The array love[1…N] is stored: .
2 4 2 1 4 3 5 2 3 1 5 4
(A classic “mutual‑love” counting problem – often seen on SPOJ, LightOJ, and other online judges) 1️⃣ Problem statement You are given a group of N people, numbered from 1 to N . Each person loves exactly one other person (possibly himself). The love‑relationships are described by an array long long ans = 0; // up to
Both limits satisfy the given constraints ( ∑ N ≤ 10⁶ ). Below are clean, production‑ready solutions in C++ (17) and Python 3 . Both follow the algorithm described above and use fast I/O to handle the maximum input size. C++ (GNU‑C++17) #include <bits/stdc++.h> using namespace std;
Because a, b is a mutual‑love pair, we have love[a] = b and love[b] = a . Assume without loss of generality that a < b .
If i, j is not mutual, at least one of the equalities love[i]=j or love[j]=i is false. Consider the iteration where i is the smaller index of the two. If love[i] ≠ j → the algorithm’s first condition ( j = love[i] ) fails. If love[i] = j but love[j] ≠ i → the second condition fails. Thus the counter is never increased for this unordered pair. ∎ Theorem After processing a test case, mutualPairs equals the total number of mutual‑love pairs in the group. Therefore the total number of increments equals precisely
def solve() -> None: data = sys.stdin.buffer.read().split() it = iter(data) t = int(next(it)) out_lines = [] for _ in range(t): n = int(next(it)) love = [0] + [int(next(it)) for _ in range(n)] # 1‑based list ans = 0 for i in range(1, n + 1): j = love[i] if i < j and love[j] == i: ans += 1 out_lines.append(str(ans)) sys.stdout.write("\n".join(out_lines))
A is an unordered pair i , j ( i ≠ j ) such that

Debe estar conectado para enviar un comentario.