Submission #1151320

#TimeUsernameProblemLanguageResultExecution timeMemory
1151320abczzNaan (JOI19_naan)C++20
29 / 100
4094 ms53992 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 A.a*B.b <= 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 i=0; i<n; ++i) {
    for (int x=0; x<n-2; ++x) {
      if (lt(X[i][x], X[i][x+1])) continue;
      while (true) {
        
      }
    }
  }
  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...