이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long, long long> ii;
bool great(ii a, ii b){
	long long wa = a.first / a.second;
	long long wb = b.first / b.second;
	if(wa == wb){
		a.first %= a.second, b.first %= b.second;
		return a.first * b.second < a.second * b.first;
	}
	return wa < wb; //is b greater than a
	
}
int main(){
	//freopen("i.txt","r",stdin);
	cin.tie(0);
	
	long long n, l;
	cin >> n >> l;
	
	long long arr[n][l];
	long long sums[n];
	fill(sums,sums+n,0);
	for(long long i = 0;i < n;i++)
		for(long long j = 0;j < l;j++){
			cin >> arr[i][j];
			sums[i] += arr[i][j];
			arr[i][j] *= n;
		}
	long long pre[n][l];
	for(long long i = 0;i < n;i++)
		for(long long j = 0;j < l;j++){
			pre[i][j] = arr[i][j];
			if(j != 0) pre[i][j] += pre[i][j-1];
		}
	
	bool used[n];
	fill(used,used+n,false);
	vector<long long> order;
	
	for(long long r = 0;r < n;r++){
		ii minfrac = ii(102344213,1);
		long long mini;
		for(long long i = 0;i < n;i++){
			if(used[i]) continue;	
			
			long long need = (r+1) * sums[i];
			long long x = upper_bound(pre[i],pre[i]+l,need) - pre[i];
			
			ii frac;
			frac.second = arr[i][x];
			frac.first = need;
			if(x != 0) frac.first -= pre[i][x-1];
			frac.first += x * frac.second;
			
			if(great(frac,minfrac)){
				minfrac = frac;
				mini = i;
			}
		}
		if(r != n-1) cout << minfrac.first << " " << minfrac.second << "\n";
		used[mini] = true;
		order.push_back(mini);
	}
	
	for(int i = 0;i < n;i++){
		cout << order[i] + 1 << " ";
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |