# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
544447 | rainboy | Ranklist Sorting (BOI07_sorting) | C11 | 5 ms | 4180 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.
/* upsolve using booklet */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1000
#define INF 0x3f3f3f3f
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int aa[N + 1];
int compare(const void *a, const void *b) {
int i = *(int *) a;
int j = *(int *) b;
return aa[j] - aa[i];
}
int main() {
static int ii[N + 1], dp[N + 1][N + 1], jj[N + 1];
static char move[N];
int n, i, i_, j, a, k;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &aa[i]);
ii[i] = i;
}
qsort(ii, n, sizeof *ii, compare);
for (i = 0; i < n; i++)
aa[ii[i]] = i;
aa[ii[n] = n] = n;
memset(dp[n], 0x3f, (n + 1) * sizeof *dp[n]), dp[n][n] = 0;
for (a = n - 1; a >= 0; a--) {
int c, x_, j_;
i_ = 0;
for (i = 0; i < ii[a]; i++)
if (aa[i] < a)
i_++;
for (i = 0, j = 0; i <= n; i++) {
if (aa[i] < a)
j++;
dp[a][i] = min(dp[a + 1][i] + (i_ + 1) + (j + 1), INF);
}
c = 0, x_ = INF, j_ = -1;
for (j = ii[a] + 1; j <= n; j++) {
int x = dp[a + 1][j] + c;
if (x_ > x)
x_ = x, j_ = j;
c += max(a - aa[j], 0);
}
dp[a][ii[a]] = x_, jj[a] = j_;
}
i_ = -1;
for (i = 0; i <= n; i++)
if (i_ == -1 || dp[0][i_] > dp[0][i])
i_ = i;
k = 0;
for (a = 0, i = i_; a < n; a++)
if (i != ii[a])
move[a] = 1, k++;
else
i = jj[a];
printf("%d\n", k);
for (a = n - 1; a >= 0; a--)
if (move[a]) {
i = 0;
while (aa[i] != a)
i++;
j = 0;
while (aa[j] != a + 1)
j++;
if (i < j) {
printf("%d %d\n", i + 1, j);
while (i + 1 < j)
aa[i] = aa[i + 1], i++;
aa[i] = a;
} else {
printf("%d %d\n", i + 1, j + 1);
while (i > j)
aa[i] = aa[i - 1], i--;
aa[i] = a;
}
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |