제출 #522688

#제출 시각아이디문제언어결과실행 시간메모리
522688phamhoanghiepNaan (JOI19_naan)C++14
100 / 100
681 ms150160 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2002;
struct frac{
    ll who;
    ll num;
    ll den;
    frac (ll _w, ll _n, ll _d): who(_w), num(_n), den(_d) {
        int x=__gcd(num,den);
        num/=x; den/=x;
    };
};
bool cmp(frac a, frac b) {
    if(a.who<b.who) return 1;
    if(a.who>b.who) return 0;
    return a.num*b.den<b.num*a.den;
}
vector<frac> split[maxn];
vector<frac> ans;
ll v[maxn][maxn];
ll sum[maxn];
int n,l;
int p[maxn];
bool used[maxn];
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>l;
    for(int i=0 ; i<n ; i++) {
        for(int j=0 ; j<l ; j++) {
            cin>>v[i][j];
            sum[i]+=v[i][j];
        }
    }
    for(int i=0 ; i<n ; i++) {
        ll cur=0;
        ll pos=0;
        for(int j=1 ; j<n ; j++) {
            while((cur+v[i][pos])*n<=sum[i]*j) cur+=v[i][pos++];
            ll rem=sum[i]*j-cur*n;
            split[i].push_back(frac(pos,rem,n*v[i][pos]));
        }
        split[i].push_back(frac(l,0,1));
    }
    for(int i=0 ; i<n ; i++) {
        int nxt=-1;
        for(int j=0 ; j<n ; j++) {
            if(used[j]) continue;
            if(nxt==-1||cmp(split[j][i],split[nxt][i])) nxt=j;
        }
        used[nxt]=1;
        ans.push_back(split[nxt][i]);
        p[i]=nxt;
    }
    ans.pop_back();
    // the one with larger end will always fit in the next window
    // so we can greedy choose the one with smallest split at i
    for(frac tmp: ans) cout<<tmp.who*tmp.den+tmp.num<<' '<<tmp.den<<'\n';
    for(int i=0 ; i<n ; i++) cout<<p[i]+1<<' ';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...