diff --git a/2022 ICPC Southeastern Europe Regional Contest/F. Fortune over Sportsmanship.cpp b/2022 ICPC Southeastern Europe Regional Contest/F. Fortune over Sportsmanship.cpp new file mode 100644 index 0000000..e422b9c --- /dev/null +++ b/2022 ICPC Southeastern Europe Regional Contest/F. Fortune over Sportsmanship.cpp @@ -0,0 +1,137 @@ +/* Problem URL: https://codeforces.com/gym/104114/problem/F */ + +#include +#include +#include + +using namespace std; +using namespace __gnu_pbds; + +template > +using ordered_set = tree; + +#define V vector + +#define rmin(a, b) a = min(a, b) +#define rmax(a, b) a = max(a, b) + +#define rep(i, lim) for (int i = 0; i < (lim); i++) +#define nrep(i, s, lim) for (int i = s; i < (lim); i++) + +#define repv(i, v) for (auto &i : (v)) +#define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } +#define sortv(v) sort(v.begin(), v.end()) +#define all(v) (v).begin(), (v).end() + +using vi = vector; +using vvi = vector; +using vvvi = vector; +using vvvvi = vector; + +using ll = long long; + +using vl = vector; +using vvl = vector; +using vvvl = vector; +using vvvvl = vector; + +template +auto operator<<(ostream &os, const vector &vec)->ostream& { + os << vec[0]; + for (size_t i = 1; i < vec.size(); i++) { + os << ' ' << vec[i]; + } + os << '\n'; + return os; +} + +template +auto operator>>(istream &is, vector &vec)->istream& { + for (auto &i : vec) { + is >> i; + } + return is; +} + +template +auto operator<<(ostream &os, const vector> &vec)->ostream& { + for (auto &i : vec) { + os << i[0]; + for (size_t j = 1; j < i.size(); j++) { + os << ' ' << i[j]; + } + os << '\n'; + } + return os; +} + +template +auto operator>>(istream &is, vector> &vec)->istream& { + for (auto &i : vec) { + for (auto &j : i) { + is >> j; + } + } + return is; +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int n; + cin >> n; + + vvl fds(n, vl(n)); + cin >> fds; + + V> edges; + rep(i, n) { + nrep(j, i + 1, n) { + edges.emplace_back(fds[i][j], i, j); + } + } + + sort(all(edges), greater<>()); + + vi dsu(n); + rep(i, n) { + dsu[i] = i; + } + + function find_p = [&](int i) { + if (dsu[i] == i) { + return i; + } + return dsu[i] = find_p(dsu[i]); + }; + + auto join = [&](int a, int b) { + a = find_p(a); + b = find_p(b); + + if (b < a) { + swap(a, b); + } + + dsu[b] = a; + return a != b; + }; + + ll ans = 0; + V> aedg; + for (auto [c, u, v] : edges) { + v = find_p(v); + u = find_p(u); + if (join(u, v)) { + ans += c; + aedg.emplace_back(u, v); + } + } + + cout << ans << '\n'; + for (auto [u, v] : aedg) { + cout << u + 1 << ' ' << v + 1 << '\n'; + } +} diff --git a/2022 ICPC Southeastern Europe Regional Contest/G. Gears.cpp b/2022 ICPC Southeastern Europe Regional Contest/G. Gears.cpp new file mode 100644 index 0000000..295e11a --- /dev/null +++ b/2022 ICPC Southeastern Europe Regional Contest/G. Gears.cpp @@ -0,0 +1,162 @@ +/* Problem URL: https://codeforces.com/gym/104114/problem/G */ + +#include +#include +#include + +using namespace std; +using namespace __gnu_pbds; + +template > +using ordered_set = tree; + +#define V vector + +#define rmin(a, b) a = min(a, b) +#define rmax(a, b) a = max(a, b) + +#define rep(i, lim) for (int i = 0; i < (lim); i++) +#define nrep(i, s, lim) for (int i = s; i < (lim); i++) + +#define repv(i, v) for (auto &i : (v)) +#define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } +#define sortv(v) sort(v.begin(), v.end()) +#define all(v) (v).begin(), (v).end() + +using vi = vector; +using vvi = vector; +using vvvi = vector; +using vvvvi = vector; + +using ll = long long; + +using vl = vector; +using vvl = vector; +using vvvl = vector; +using vvvvl = vector; + +template +auto operator<<(ostream &os, const vector &vec)->ostream& { + os << vec[0]; + for (size_t i = 1; i < vec.size(); i++) { + os << ' ' << vec[i]; + } + os << '\n'; + return os; +} + +template +auto operator>>(istream &is, vector &vec)->istream& { + for (auto &i : vec) { + is >> i; + } + return is; +} + +template +auto operator<<(ostream &os, const vector> &vec)->ostream& { + for (auto &i : vec) { + os << i[0]; + for (size_t j = 1; j < i.size(); j++) { + os << ' ' << i[j]; + } + os << '\n'; + } + return os; +} + +template +auto operator>>(istream &is, vector> &vec)->istream& { + for (auto &i : vec) { + for (auto &j : i) { + is >> j; + } + } + return is; +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int n; + cin >> n; + + vl fds(n); + cin >> fds; + + vl diffs(n - 1); + + rep(i, n - 1) { + diffs[i] = abs(fds[i] - fds[i + 1]); + } + + vl ans(n); + nrep(i, 1, n) { + ans[i] = diffs[i - 1] - ans[i - 1]; + } + + map count; + rep(i, n) { + ll n; + cin >> n; + count[n]++; + } + + ll oo = INT64_MAX >> 1; + ll minimal_odd = oo; + ll odd_i = 0; + ll minimal_ev = oo; + ll ev_i = 0; + + rep(i, n) { + if (i & 1) { + if (ans[i] < minimal_odd) { + minimal_odd = ans[i]; + odd_i = i; + } + continue; + } + + if (ans[i] < minimal_ev) { + minimal_ev = ans[i]; + ev_i = i; + } + } + + auto check_k = [&](ll k) { + rep(i, n) { + ll now = 0; + if (i & 1) { + now = ans[i] - k; + } else { + now = ans[i] + k; + } + + if (count[now] == 0) { + return false; + } + count[now]--; + } + + return true; + }; + + ll act = count.begin()->first; + + ll k = -(ans[ev_i] - act); + if (!check_k(k)) { + k = ans[odd_i] - act; + } + + rep(i, n) { + if (i & 1) { + cout << ans[i] - k; + } else { + cout << ans[i] + k; + } + + cout << " \n"[i == n - 1]; + } +}