Submission #921723

#TimeUsernameProblemLanguageResultExecution timeMemory
921723boris_mihovNaan (JOI19_naan)C++17
0 / 100
1 ms604 KiB
#include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> typedef long long llong; const int MAXN = 2000 + 10; const int INF = 1e9; int n, l; struct Fraction { llong p; llong q; Fraction() { p = 0; q = 1; } Fraction(llong _p, llong _q = 1) { p = _p; q = _q; llong g = std::__gcd(p, q); p /= g; q /= g; } friend Fraction operator + (const Fraction &left, const Fraction &right) { return {left.p * right.q + right.p * left.q, left.q * right.q}; } friend Fraction operator - (const Fraction &left, const Fraction &right) { return {left.p * right.q - right.p * left.q, left.q * right.q}; } friend Fraction operator * (const Fraction &left, const Fraction &right) { return {left.p * right.p, left.q * right.q}; } friend Fraction operator / (const Fraction &left, const Fraction &right) { return {left.p * right.q, left.q * right.p}; } friend void operator += (Fraction &left, const Fraction &right) { left = left + right; } friend void operator -= (Fraction &left, const Fraction &right) { left = left - right; } friend void operator *= (Fraction &left, const Fraction &right) { left = left * right; } friend void operator /= (Fraction &left, const Fraction &right) { left = left / right; } friend bool operator < (const Fraction &left, const Fraction &right) { return (left.p * right.q < right.p * left.q); } friend bool operator <= (const Fraction &left, const Fraction &right) { return (left.p * right.q <= right.p * left.q); } void print() { std::cout << p << ' ' << q << '\n'; } }; bool taken[MAXN]; Fraction s[MAXN]; llong v[MAXN][MAXN]; Fraction nextSum[MAXN]; Fraction currentSum[MAXN]; std::vector <Fraction> positions; std::vector <int> order; void solve() { Fraction takenTo = 0; for (int pos = 1 ; pos <= l + 1 ; ++pos) { bool found = false; Fraction minimum = l; int idx = -1; for (int i = 1 ; i <= n ; ++i) { if (taken[i]) { continue; } nextSum[i] = currentSum[i] + (1 - takenTo) * v[i][pos]; if (s[i] <= nextSum[i]) { Fraction must = pos - 1 + takenTo + (s[i] - currentSum[i]) / v[i][pos]; if (must < minimum) { minimum = must; idx = i; } } } if (idx == -1) { takenTo = 0; for (int i = 1 ; i <= n ; ++i) { currentSum[i] = nextSum[i]; } } else { taken[idx] = true; order.push_back(idx); positions.push_back(minimum); takenTo = minimum; pos--; continue; } } positions.pop_back(); } void print() { for (int i = 0 ; i < n - 1 ; ++i) { positions[i].print(); } for (int i = 0 ; i < n ; ++i) { std::cout << order[i] << ' '; } std::cout << '\n'; } void input() { std::cin >> n >> l; for (int i = 1 ; i <= n ; ++i) { for (int j = 1 ; j <= l ; ++j) { std::cin >> v[i][j]; s[i] += v[i][j]; } s[i] /= n; } } void fastIOI() { std::ios_base :: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } int main() { fastIOI(); input(); solve(); print(); return 0; }

Compilation message (stderr)

naan.cpp: In function 'void solve()':
naan.cpp:99:14: warning: unused variable 'found' [-Wunused-variable]
   99 |         bool found = false;
      |              ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...