voidsolve(){ int n, k; cin >> n >> k; std::vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } std::sort(a.begin(), a.end()); int p1 = 0, p2 = n - 1; int ans = 0; while (p1 < p2) { if (a[p1] + a[p2] == k) { ans++; p1++; p2--; } elseif (a[p1] + a[p2] < k) { p1++; } else { p2--; } } cout << ans << "\n"; }
方法二:计数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
voidsolve(){ int n, k; cin >> n >> k; std::vector<int> cnt(n + 1); for (int i = 0; i < n; i++) { int a; cin >> a; cnt[a]++; } int ans = 0; for (int i = 1; i <= n; i++) { if (i * 2 < k && k - i <= n) { ans += std::min(cnt[i], cnt[k - i]); } elseif (2 * i == k) { ans += cnt[i] / 2; } } cout << ans << "\n"; }
for (int i = 0; i < m1; i++) { int u, v; cin >> u >> v; g1[u].push_back(v); g1[v].push_back(u); }
for (int i = 0; i < m2; i++) { int u, v; cin >> u >> v; usetg2.union_set(u, v); }
std::map<int, int> mm; int cnt = 0; for (int i = 1; i <= n; i++) { if (mm.find(usetg2.find_father(i)) == mm.end()) { mm[usetg2.find_father(i)] = cnt++; } } std::vector<std::vector<int>> g3(cnt, std::vector<int>()); for (int i = 1; i <= n; i++) { g3[mm[usetg2.find_father(i)]].push_back(i); }
int ans = 0; std::vector<bool> vis(n + 1); std::queue<int> q; for (auto &vec : g3) { std::set<int> ms; for (int i : vec) { if (vis[i]) continue; q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); for (int v : g1[u]) { if (!vis[v] && usetg2.in_same_set(u, v)) { usetg1.union_set(u, v); vis[v] = true; q.push(v); } } } } for (int i : vec) { ms.insert(usetg1.find_father(i)); } ans += ms.size() - 1; } for (int u = 1; u <= n; u++) { for (int v : g1[u]) { usetg1.union_set(u, v); } } int ans2 = 0; for (int u = 1; u <= n; u++) { for (int v : g1[u]) { if (!usetg2.in_same_set(u, v)) { ans2++; } } } cout << ans + ans2 / 2 << "\n"; }