# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1151305 | abczz | Naan (JOI19_naan) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <numeric>
#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;
};
Frac tot[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 A.a*B.b <= A.b*B.a;
}
void reset() {
for (int i=0; i<n; ++i) {
tot[i] = simplify({S[i], n});
}
}
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];
}
}
reset();
for (int j=0; j<l; ++j) {
Frac cur = {0, 1};
while (true) {
ll id = -1;
Frac tmp = {1, 1};
for (int i=0; i<n; ++i) {
if (B[i]) continue;
auto v = tot[i]/Frac({A[i][j], 1});
if (lt(v, tmp) && lte(cur+v, Frac{1, 1})) {
tmp = v;
id = i;
}
}
if (id == -1) {
for (int i=0; i<n; ++i) {
auto u = Frac({1, 1})-cur;
u = u * Frac({A[i][j], 1});
tot[i] = tot[i] - u;
}
break;
}
V.push_back(id+1);
B[id] = 1;
auto v = tot[id]/Frac({A[id][j], 1});
cur = cur + v;
print(Frac{j, 1} + cur);
reset();
if (V.size() == n-1) break;
}
if (V.size() == n-1) break;
}
for (auto u : V) {
cout << u << " ";
}
for (int i=0; i<n; ++i) {
if (!B[i]) cout << i+1 << " ";
}
cout << '\n';
}