# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
163087 | georgerapeanu | Naan (JOI19_naan) | C++11 | 45 ms | 3576 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 2000;
const int LMAX = 2000;
const long long NUM_LIM = 2e8;
int n,l;
int v[NMAX + 5][LMAX + 5];
bool taken[NMAX + 5];
int perm[NMAX + 5];
long long gcd(long long a,long long b){
return 1;
if(!b){
return a;
}
return gcd(b,a % b);
}
long long lst_cost[NMAX + 5]; /// apromiated real value * NUM_LIM
long long target_cost[NMAX + 5];
long long split[NMAX + 5];
int main(){
scanf("%d %d",&n,&l);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= l;j++){
scanf("%d",&v[i][j]);
target_cost[i] = target_cost[i] + 1LL * v[i][j] * NUM_LIM;
}
target_cost[i] = (target_cost[i] / n + (target_cost[i] % n != 0));
}
long long last_pos = 0;
int cnt_splits = 0;
while(cnt_splits < n - 1){
bool expand = false;
for(int i = 1;i <= n;i++){
if(taken[i]){
continue;
}
lst_cost[i] = lst_cost[i] + ((last_pos / NUM_LIM + 1) * NUM_LIM - last_pos) * v[i][last_pos / NUM_LIM + 1];
expand |= (target_cost[i] <= lst_cost[i]);
}
last_pos = (last_pos / NUM_LIM + 1) * NUM_LIM;
if(expand == false){
continue;
}
long long bst_frac = 0;
int id = -1;
for(int i = 1;i <= n;i++){
if(taken[i]){
continue;
}
if(target_cost[i] <= lst_cost[i]){
long long tmp = lst_cost[i] - target_cost[i];
tmp = tmp / v[i][last_pos / NUM_LIM] + (tmp % v[i][last_pos / NUM_LIM] != 0);
if(id == -1 || bst_frac <= tmp){
bst_frac = tmp;
id = i;
}
}
}
last_pos = last_pos - bst_frac;
for(int i = 1;i <= n;i++){
if(taken[i]){
continue;
}
lst_cost[i] = 0;
}
split[++cnt_splits] = last_pos;
taken[id] = true;
perm[cnt_splits] = id;
}
for(int i = 1;i <= n;i++){
if(taken[i] == false){
perm[n] = i;
}
}
for(int i = 1;i < n;i++){
printf("%lld %lld\n",split[i] / gcd(split[i],NUM_LIM),(long long)(NUM_LIM / gcd(split[i],NUM_LIM)));
}
for(int i = 1;i <= n;i++){
printf("%d ",perm[i]);
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |