Submission #1151081

#TimeUsernameProblemLanguageResultExecution timeMemory
1151081SharkyNaan (JOI19_naan)C++20
100 / 100
1503 ms126060 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif #define int long long #define fi first #define se second #define L(i, j, k) for (int i = (j); i <= (k); i++) #define R(i, j, k) for (int i = (j); i >= (k); i--) #define all(x) x.begin(), x.end() const int N = 2005; int v[N][N], req[N], ps[N][N], happy[N]; pair<int, int> s[N][N]; pair<int, int> add(pair<int, int> a, pair<int, int> b) { int lc = lcm(a.se, b.se); a.fi *= (lc / a.se); b.fi *= (lc / b.se); pair<int, int> res = {a.fi + b.fi, lc}; int g = gcd(res.fi, res.se); if (g) res.fi /= g, res.se /= g; return res; } pair<int, int> sub(pair<int, int> a, pair<int, int> b) { int lc = lcm(a.se, b.se); a.fi *= (lc / a.se); b.fi *= (lc / b.se); pair<int, int> res = {a.fi - b.fi, lc}; int g = gcd(res.fi, res.se); if (g) res.fi /= g, res.se /= g; return res; } pair<int, int> mul(pair<int, int> a, pair<int, int> b) { a.fi *= b.fi, a.se *= b.se; int g = gcd(a.fi, a.se); if (g) a.fi /= g, a.se /= g; return a; } bool leq(pair<int, int> a, pair<int, int> b) { return (__int128) a.fi * b.se <= (__int128) a.se * b.fi; } void solve() { int n, len; cin >> n >> len; for (int i = 1; i <= n; i++) { for (int j = 1; j <= len; j++) { cin >> v[i][j]; req[i] += v[i][j]; ps[i][j] = ps[i][j-1] + v[i][j]; } } for (int i = 1; i <= n; i++) { for (int it = 1; it <= n; it++) { pair<int, int> p = {it * req[i], n}; int l = 0, r = len; while (l < r) { int mid = (l + r + 1) / 2; if (leq(make_pair(ps[i][mid], 1), p)) l = mid; else r = mid - 1; } if (l < len) { pair<int, int> diff = sub(p, make_pair(ps[i][l], 1)); pair<int, int> cur = add(make_pair(l, 1), mul(diff, make_pair(1, v[i][l+1]))); s[i][it] = cur; } else s[i][it] = {len, 1}; } } vector<int> perm; for (int it = 1; it <= n; it++) { pair<int, int> ep = {1, 0}; int id; for (int i = 1; i <= n; i++) { if (happy[i]) continue; if (leq(s[i][it], ep)) ep = s[i][it], id = i; } perm.push_back(id); happy[id] = 1; if (it < n) cout << ep.first << " " << ep.second << '\n'; } for (int e : perm) cout << e << ' '; } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int test = 1; // cin >> test; while (test--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...