HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342) - AtCoder
B - Which is ahead?
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define endl '\n' int main() { int n; cin >> n; vector<int> p(n); REP(i,n) cin >> p[i]; vector<int> m(n+1); REP(i,n) m[p[i]] = i; int q; cin >> q; REP(_,q) { int a,b; cin >> a >> b; int v1 = m[a], v2 = m[b]; if (v1 > v2) swap(a,b); cout << a << endl; } return 0; }
C - Many Replacement
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define endl '\n' int main() { int n,q; string s; cin >> n >> s >> q; vector<char> c(26); REP(i,26) c[i] = char('a' + i); REP(_,q) { char a,b; cin >> a >> b; REP(i,26) if (c[i] == a) c[i] = b; } for(auto v: s) cout << c[v-'a']; return 0; }
D - Square Pair
A について素因数分解して平方数で割った残りの数を計算する。 map でその数をカウントしておいて、各値xに対して (map[x] * (map[x]-1)) / 2 の数だけ組み合わせが作れる。 0 のケースの扱いに気をつける。
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define endl '\n' using ll = long long; vector<ll> prime_factorize(ll n) { vector<ll> res; for(ll a = 2; a*a <= n; a++) { if (n%a != 0) continue; ll ex = 0; while(n%a == 0) { ex++; n /= a; } if (ex % 2) res.emplace_back(a); } if (n != 1) res.emplace_back(n); return res; } int main() { int n; cin >> n; vector<ll> a(n); REP(i,n) cin >> a[i]; map<ll,ll> mp; REP(i,n) { auto pf = prime_factorize(a[i]); ll now = 1; for(auto v: pf) now *= v; mp[now]++; } ll ans = 0; for(auto [k,v]: mp) { if (k == 0) ans += (n-1)*v; else ans += (mp[0] + (v-1))*v; } cout << ans/2 << endl; return 0; }