제출 #1151318

#제출 시각아이디문제언어결과실행 시간메모리
1151318SharkyNaan (JOI19_naan)C++20
29 / 100
1520 ms54060 KiB
#include <iostream> #include <numeric> #include <vector> #define ll long long using namespace std; vector <ll> V; ll n, l, A[2000][2000], S[2000]; bool B[2000]; struct Frac{ ll a; ll b; }; vector <Frac> X[2000]; Frac simplify(Frac A) { ll x = gcd(A.a, A.b); return {A.a/x, A.b/x}; } Frac operator+(Frac A, Frac B) { return simplify({A.a*B.b+A.b*B.a, A.b*B.b}); } Frac operator-(Frac A, Frac B) { return simplify({A.a*B.b-A.b*B.a, A.b*B.b}); } Frac operator*(Frac A, Frac B) { return simplify({A.a*B.a, A.b*B.b}); } Frac operator/(Frac A, Frac B) { return simplify({A.a*B.b, A.b*B.a}); } bool lt(Frac A, Frac B) { return A.a*B.b < A.b*B.a; } bool lte(Frac A, Frac B) { return (__int128) A.a*B.b <= (__int128) A.b*B.a; } void print(Frac A) { cout << A.a << " " << A.b << '\n'; } int main() { cin.tie(0); ios::sync_with_stdio(0); cin >> n >> l; for (int i=0; i<n; ++i) { for (int j=0; j<l; ++j) { cin >> A[i][j]; S[i] += A[i][j]; } Frac tot = simplify(Frac{S[i], n}); ll x = 1; for (int j=0; j<l; ++j) { Frac cur = {0, 1}; while (X[i].size() < n-1) { auto v = tot/Frac({A[i][j], 1}); if (lte(cur+v, Frac{1, 1})) { cur = cur + v; X[i].push_back(Frac{j, 1} + cur); tot = simplify(Frac{S[i], n}); } else { auto u = Frac({1, 1})-cur; u = u * Frac({A[i][j], 1}); tot = tot - u; break; } } } } for (int x=0; x<n-1; ++x) { Frac tmp = {l, 1}; ll id = -1; for (int i=0; i<n; ++i) { if (B[i]) continue; if (lt(X[i][x], tmp)) { tmp = X[i][x]; id = i; } } print(X[id][x]); V.push_back(id+1); B[id] = 1; } for (auto u : V) { cout << u << " "; } for (int i=0; i<n; ++i) { if (!B[i]) cout << i+1 << " "; } cout << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...