제출 #330529

#제출 시각아이디문제언어결과실행 시간메모리
330529EndRayNaan (JOI19_naan)C++17
29 / 100
2009 ms92000 KiB
#include<bits/stdc++.h> #define ll long long using namespace std; const int N = 2000+1; struct fraction{ ll num, den; fraction():num(0), den(1){} fraction(ll num):num(num), den(1){} fraction(ll num, ll den):num(num), den(den){} void normalize(){ ll g = __gcd(num, den); num /= g; den /= g; if(den < 0){ num = -num; den = -den; } } fraction operator-(){ return fraction{-num, den}; } fraction operator+=(const fraction& b){ num = num*b.den + den*b.num; den = den*b.den; normalize(); return *this; } fraction operator-=(const fraction& b){ num = num*b.den - den*b.num; den = den*b.den; normalize(); return *this; } fraction operator*=(const fraction& b){ num = num*b.num; den = den*b.den; normalize(); return *this; } fraction operator/=(const fraction& b){ num = num*b.den; den = den*b.num; normalize(); return *this; } bool operator==(const fraction& b){return num*b.den == den*b.num;} bool operator<(const fraction& b){return num*b.den < den*b.num;} bool operator>(const fraction& b){return num*b.den > den*b.num;} bool operator<=(const fraction& b){return num*b.den <= den*b.num;} bool operator>=(const fraction& b){return num*b.den >= den*b.num;} }; fraction operator+(fraction a, const fraction& b){return (a += b);} fraction operator-(fraction a, const fraction& b){return (a -= b);} fraction operator*(fraction a, const fraction& b){return (a *= b);} fraction operator/(fraction a, const fraction& b){return (a /= b);} int n, l; ll v[N][N]; ll sum[N]; fraction split[N][N]; bool used[N]; fraction ans[N]; int p[N]; int main(){ ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0); cin >> n >> l; for(int i = 0; i < n; ++i) for(int j = 1; j <= l; ++j){ cin >> v[i][j]; sum[i] += v[i][j]; } for(int i = 0; i < n; ++i){ split[i][0] = 0; split[i][n] = n; fraction need = fraction(sum[i], n); int k = 1; for(int j = 1; j < n; ++j){ fraction now_need = need; split[i][j] = split[i][j-1]; do{ fraction can = v[i][k]*(k - split[i][j]); if(can >= now_need){ split[i][j] += now_need/v[i][k]; break; } else{ now_need -= can; split[i][j] = k++; } } while(true); } } for(int j = 1; j < n; ++j){ fraction mn = l; int mn_i = -1; for(int i = 0; i < n; ++i) if(!used[i] && mn > split[i][j]){ mn = split[i][j]; mn_i = i; } ans[j] = mn; p[j] = mn_i; used[mn_i] = true; } for(int i = 0; i < n; ++i) if(!used[i]) p[n] = i; for(int j = 1; j < n; ++j) cout << ans[j].num << " " << ans[j].den << "\n"; for(int j = 1; j <= n; ++j) cout << p[j]+1 << " "; cout << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...