제출 #377984

#제출 시각아이디문제언어결과실행 시간메모리
377984pit4hNaan (JOI19_naan)C++14
29 / 100
430 ms7212 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 2e3+1; int n, l, v[MAXN][MAXN], pref[MAXN][MAXN]; struct Q { ll p, q; void norm() { ll g = __gcd(p, q); p /= g, q /= g; } Q() { p=0, q=1; } Q(ll _p, ll _q) { p=_p, q=_q, norm(); } bool operator<(const Q& other) const { return (ll)p * other.q < (ll)other.p * q; } Q operator+(const Q& other) const { return Q(p*other.q + other.p*q, q*other.q); } Q operator-(const Q& other) const { return Q(p*other.q - other.p*q, q*other.q); } Q operator*(const Q& other) const { return Q(p*other.p, q*other.q); } Q operator/(const Q& other) const { return Q(p*other.q, q*other.p); } ll floor() { return p/q; }; }; Q calc(Q start, int it) { int st = start.floor(); int lo = st, hi = l-1, res=st; Q beg = Q(v[it][st], 1) * (Q(st+1, 1) - start); //cerr<<" "<<beg.p<<' '<<beg.q<<'\n'; Q score = Q(0, 1); while(lo <= hi) { int mid = (lo+hi)/2; Q cur_score = beg + Q(pref[it][mid] - pref[it][st], 1); //cerr<<" "<<mid<<": "<<cur_score.p<<' '<<cur_score.q<<'\n'; if(!(Q(pref[it][l], n) < cur_score)) { //cerr<<".\n"; score = cur_score; res = mid + 1; lo = mid+1; } else { hi = mid-1; } } //cerr<<" "<<st<<' '<<res<<' '<<score.p<<' '<<score.q<<'\n'; Q ret; if(res>st) { ret = Q(res, 1) + (Q(pref[it][l], n) - score) / Q(v[it][res], 1); } else { ret = start + (Q(pref[it][l], n) - score) / Q(v[it][res], 1); } return ret; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>l; for(int i=1; i<=n; ++i) { for(int j=1; j<=l; ++j) { cin>>v[i][j]; pref[i][j] = pref[i][j-1] + v[i][j]; } } vector<int> people; for(int i=1; i<=n; ++i) people.push_back(i); Q start(1, 1); vector<int> perm; vector<Q> X; for(int iter=1; iter<=n; ++iter) { int& best = people[0]; Q bestv; //cerr<<"iter: "<<iter<<'\n'; for(int& i: people) { //cerr<<i<<'\n'; Q curv = calc(start, i); //cerr<<' '<<curv.p<<' '<<curv.q<<'\n'; if(i==people[0] || curv < bestv) { swap(best, i); bestv = curv; } } perm.push_back(best); start = bestv; best = people.back(); people.pop_back(); if(iter < n) X.push_back(start); } for(auto& i: X) { i = i - Q(1, 1); cout<<i.p<<' '<<i.q<<'\n'; } for(auto i: perm) { cout<<i<<' '; } cout<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...