Submission #62818570
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
using DOUBLE = __float128;
using VI = vector<int>;
using VD = vector<double>;
using VVD = vector<VD>;
const DOUBLE EPS = 1e-10;
struct LPSolver {
int m, n;
VI B, N;
VVD D;
LPSolver(const VVD &A, const VD &b, const VD &c) :
m(b.size()), n(c.size()), N(n + 1), B(m), D(m + 2, VD(n + 2)) {
for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) D[i][j] = A[i][j];
for (int i = 0; i < m; i++) { B[i] = n + i; D[i][n] = -1; D[i][n + 1] = b[i]; }
for (int j = 0; j < n; j++) { N[j] = j; D[m][j] = -c[j]; }
N[n] = -1; D[m + 1][n] = 1;
}
void Pivot(int r, int s) {
double inv = 1.0 / D[r][s];
for (int i = 0; i < m + 2; i++) if (i != r)
for (int j = 0; j < n + 2; j++) if (j != s)
D[i][j] -= D[r][j] * D[i][s] * inv;
for (int j = 0; j < n + 2; j++) if (j != s) D[r][j] *= inv;
for (int i = 0; i < m + 2; i++) if (i != r) D[i][s] *= -inv;
D[r][s] = inv;
swap(B[r], N[s]);
}
bool Simplex(int phase) {
int x = phase == 1 ? m + 1 : m;
while (true) {
int s = -1;
for (int j = 0; j <= n; j++) {
if (phase == 2 && N[j] == -1) continue;
if (s == -1 || D[x][j] < D[x][s] || D[x][j] == D[x][s] && N[j] < N[s]) s = j;
}
if (D[x][s] > -EPS) return true;
int r = -1;
for (int i = 0; i < m; i++) {
if (D[i][s] < EPS) continue;
if (r == -1 || D[i][n + 1] / D[i][s] < D[r][n + 1] / D[r][s] ||
(D[i][n + 1] / D[i][s]) == (D[r][n + 1] / D[r][s]) && B[i] < B[r]) r = i;
}
if (r == -1) return false;
Pivot(r, s);
}
}
DOUBLE Solve(VD &x) {
int r = 0;
for (int i = 1; i < m; i++) if (D[i][n + 1] < D[r][n + 1]) r = i;
if (D[r][n + 1] < -EPS) {
Pivot(r, n);
if (!Simplex(1) || D[m + 1][n + 1] < -EPS) return -numeric_limits<DOUBLE>::infinity();
for (int i = 0; i < m; i++) if (B[i] == -1) {
int s = -1;
for (int j = 0; j <= n; j++)
if (s == -1 || D[i][j] < D[i][s] || D[i][j] == D[i][s] && N[j] < N[s]) s = j;
Pivot(i, s);
}
}
if (!Simplex(2)) return numeric_limits<DOUBLE>::infinity();
x = VD(n);
for (int i = 0; i < m; i++) if (B[i] < n) x[B[i]] = D[i][n + 1];
return D[m][n + 1];
}
};
const int MAXN = 11;
int board[MAXN][MAXN];
/*
U_1, U_2, ..., U_{2 * N * (N-1)}
ezek c-je -1
-D_i_j + D_i_j+1 - U <= -a_i_j+1 + a_i_j
D_i_j - D_i_j+1 - U <= a_i_j+1 - a_i_j
D_i_j - K_i_j <= 10^12
-D_i_j - K_i_j <= -10^12
sum K <= P/Q
K >= 0
U >= 0
D'_i_j >= 0
n = 2 * N * (N-1) + N * N + N * N
m = 4 * N * (N-1) + 2 * N * N + 1
*/
const DOUBLE INF = 1000;
void solve() {
int n; long double p, q; cin >> n >> p >> q;
DOUBLE lim = DOUBLE(p)/q;
lim = min(DOUBLE(1000), lim);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> board[i][j];
}
}
const int NUM_VAR = 2 * n * (n-1) + n * n + n * n;
const int NUM_INEQ = 4 * n * (n-1) + 2 * n * n + 1;
VVD A(NUM_INEQ, VD(NUM_VAR));
VD B(NUM_INEQ), C(NUM_VAR);
for (int i = 0; i < 2 * n * (n-1); i++) {
C[i] = -1;
}
auto get_index_d = [&](int i, int j) {
return 2 * n * (n-1) + i*n + j;
};
auto get_index_k = [&](int i, int j) {
return 2 * n * (n-1) + n*n + i*n + j;
};
auto get_index_u_2 = [&](int i, int j) {
return (n-1)*i+j;
};
auto get_index_u_1 = [&](int i, int j) {
return n * (n-1) + i+(n-1)*j;
};
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-1; j++) {
int ptr = get_index_u_2(i, j)*2;
A[ptr][get_index_d(i, j)] = -1;
A[ptr][get_index_d(i, j+1)] = 1;
A[ptr][get_index_u_2(i, j)] = -1;
B[ptr] = -board[i][j+1] + board[i][j];
ptr++;
A[ptr][get_index_d(i, j)] = 1;
A[ptr][get_index_d(i, j+1)] = -1;
A[ptr][get_index_u_2(i, j)] = -1;
B[ptr] = board[i][j+1] - board[i][j];
}
}
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n; j++) {
int ptr = get_index_u_1(i, j)*2;
A[ptr][get_index_d(i, j)] = -1;
A[ptr][get_index_d(i+1, j)] = 1;
A[ptr][get_index_u_1(i, j)] = -1;
B[ptr] = -board[i+1][j] + board[i][j];
ptr++;
A[ptr][get_index_d(i, j)] = 1;
A[ptr][get_index_d(i+1, j)] = -1;
A[ptr][get_index_u_1(i, j)] = -1;
B[ptr] = board[i+1][j] - board[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int ptr = 4 * n * (n-1) + (i*n + j) * 2;
A[ptr][get_index_d(i, j)] = 1;
A[ptr][get_index_k(i, j)] = -1;
B[ptr] = INF;
ptr++;
A[ptr][get_index_d(i, j)] = -1;
A[ptr][get_index_k(i, j)] = -1;
B[ptr] = -INF;
}
}
int ptr = 4 * n * (n-1) + 2 * n * n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[ptr][get_index_k(i, j)] = 1;
}
}
B[ptr] = p/q;
LPSolver lp(A, B, C);
VD res;
cout << fixed << setprecision(20);
cout << (long double)-lp.Solve(res) << "\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << (long double)((DOUBLE)board[i][j] + res[get_index_d(i, j)]-INF) << " ";
}
cout << "\n";
}
// int n, m; cin >> n >> m;
// VVD A(m, VD(n));
// VD B(m), C(n);
// for (int i = 0; i < m; i++) {
// for (int j = 0; j < n; j++) {
// cin >> A[i][j];
// }
// cin >> B[i];
// }
// for (int i = 0; i < n; i++) cin >> C[i];
// LPSolver lp(A, B, C);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | G - Unevenness |
| User | SzilB |
| Language | C++ 20 (gcc 12.2) |
| Score | 0 |
| Code Size | 6344 Byte |
| Status | WA |
| Exec Time | 178 ms |
| Memory | 6772 KiB |
Compile Error
Main.cpp: In constructor ‘LPSolver::LPSolver(const VVD&, const VD&, const VD&)’:
Main.cpp:13:11: warning: ‘LPSolver::N’ will be initialized after [-Wreorder]
13 | VI B, N;
| ^
Main.cpp:13:8: warning: ‘VI LPSolver::B’ [-Wreorder]
13 | VI B, N;
| ^
Main.cpp:16:5: warning: when initialized here [-Wreorder]
16 | LPSolver(const VVD &A, const VD &b, const VD &c) :
| ^~~~~~~~
Main.cpp: In member function ‘bool LPSolver::Simplex(int)’:
Main.cpp:41:68: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
41 | if (s == -1 || D[x][j] < D[x][s] || D[x][j] == D[x][s] && N[j] < N[s]) s = j;
Main.cpp:48:64: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
48 | (D[i][n + 1] / D[i][s]) == (D[r][n + 1] / D[r][s]) && B[i] < B[r]) r = i;
Main.cpp: In member function ‘DOUBLE LPSolver::Solve(VD&)’:
Main.cpp:64:68: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
64 | if (s == -1 || D[i][j] < D[i][s] || D[i][j] == D[i][s] && N[j] < N[s]) s = j;
Judge Result
| Set Name | Sample | All | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 0 / 675 | ||||||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt, 00_sample_05.txt |
| All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt, 00_sample_05.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 02_corner_1_00.txt, 02_corner_1_01.txt, 02_corner_1_02.txt, 02_corner_1_03.txt, 02_corner_1_04.txt, 02_corner_1_05.txt, 02_corner_1_06.txt, 02_corner_1_07.txt, 02_corner_1_08.txt, 02_corner_1_09.txt, 02_corner_1_10.txt, 02_corner_1_11.txt, 02_corner_1_12.txt, 02_corner_1_13.txt, 03_corner_2_00.txt, 03_corner_2_01.txt, 03_corner_2_02.txt, 03_corner_2_03.txt, 03_corner_2_04.txt, 03_corner_2_05.txt, 03_corner_2_06.txt, 03_corner_2_07.txt, 03_corner_2_08.txt, 03_corner_2_09.txt, 03_corner_2_10.txt, 03_corner_2_11.txt, 03_corner_2_12.txt, 03_corner_2_13.txt, 03_corner_2_14.txt, 03_corner_2_15.txt, 03_corner_2_16.txt, 03_corner_2_17.txt, 03_corner_2_18.txt, 04_corner_3_00.txt, 04_corner_3_01.txt, 04_corner_3_02.txt, 04_corner_3_03.txt, 04_corner_3_04.txt, 04_corner_3_05.txt, 04_corner_3_06.txt, 04_corner_3_07.txt, 04_corner_3_08.txt, 04_corner_3_09.txt, 04_corner_3_10.txt, 04_corner_3_11.txt, 05_corner_4_00.txt, 05_corner_4_01.txt, 05_corner_4_02.txt, 05_corner_4_03.txt, 05_corner_4_04.txt, 05_corner_4_05.txt, 05_corner_4_06.txt, 05_corner_4_07.txt, 05_corner_4_08.txt, 05_corner_4_09.txt, 05_corner_4_10.txt, 05_corner_4_11.txt, 05_corner_4_12.txt, 05_corner_4_13.txt, 06_corner_5_00.txt, 06_corner_5_01.txt, 06_corner_5_02.txt, 06_corner_5_03.txt, 06_corner_5_04.txt, 06_corner_5_05.txt, 06_corner_5_06.txt, 06_corner_5_07.txt, 06_corner_5_08.txt, 06_corner_5_09.txt, 06_corner_5_10.txt, 06_corner_5_11.txt, 06_corner_5_12.txt, 06_corner_5_13.txt, 07_corner_6_00.txt, 07_corner_6_01.txt, 07_corner_6_02.txt, 07_corner_6_03.txt, 07_corner_6_04.txt, 07_corner_6_05.txt, 07_corner_6_06.txt, 07_corner_6_07.txt, 07_corner_6_08.txt, 07_corner_6_09.txt, 08_corner_7_00.txt, 08_corner_7_01.txt, 08_corner_7_02.txt, 08_corner_7_03.txt, 08_corner_7_04.txt, 08_corner_7_05.txt, 08_corner_7_06.txt, 08_corner_7_07.txt, 08_corner_7_08.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 00_sample_00.txt | AC | 1 ms | 3844 KiB |
| 00_sample_01.txt | AC | 2 ms | 3916 KiB |
| 00_sample_02.txt | AC | 1 ms | 3832 KiB |
| 00_sample_03.txt | WA | 2 ms | 3960 KiB |
| 00_sample_04.txt | WA | 3 ms | 3920 KiB |
| 00_sample_05.txt | AC | 82 ms | 6728 KiB |
| 01_random_00.txt | AC | 75 ms | 6672 KiB |
| 01_random_01.txt | WA | 1 ms | 3816 KiB |
| 01_random_02.txt | WA | 152 ms | 6672 KiB |
| 01_random_03.txt | AC | 67 ms | 5544 KiB |
| 01_random_04.txt | AC | 57 ms | 6724 KiB |
| 01_random_05.txt | AC | 1 ms | 3848 KiB |
| 01_random_06.txt | AC | 63 ms | 6696 KiB |
| 01_random_07.txt | AC | 1 ms | 3864 KiB |
| 01_random_08.txt | AC | 62 ms | 6640 KiB |
| 01_random_09.txt | AC | 61 ms | 6644 KiB |
| 01_random_10.txt | AC | 66 ms | 6764 KiB |
| 01_random_11.txt | WA | 1 ms | 3716 KiB |
| 01_random_12.txt | AC | 67 ms | 6636 KiB |
| 01_random_13.txt | AC | 1 ms | 3900 KiB |
| 01_random_14.txt | WA | 178 ms | 6680 KiB |
| 01_random_15.txt | WA | 2 ms | 4020 KiB |
| 01_random_16.txt | AC | 87 ms | 6648 KiB |
| 01_random_17.txt | AC | 1 ms | 3820 KiB |
| 01_random_18.txt | AC | 83 ms | 6520 KiB |
| 01_random_19.txt | AC | 2 ms | 4004 KiB |
| 02_corner_1_00.txt | AC | 57 ms | 6692 KiB |
| 02_corner_1_01.txt | AC | 58 ms | 6648 KiB |
| 02_corner_1_02.txt | AC | 58 ms | 6660 KiB |
| 02_corner_1_03.txt | AC | 58 ms | 6672 KiB |
| 02_corner_1_04.txt | WA | 58 ms | 6696 KiB |
| 02_corner_1_05.txt | AC | 68 ms | 6672 KiB |
| 02_corner_1_06.txt | AC | 61 ms | 6724 KiB |
| 02_corner_1_07.txt | AC | 62 ms | 6672 KiB |
| 02_corner_1_08.txt | AC | 58 ms | 6716 KiB |
| 02_corner_1_09.txt | AC | 61 ms | 6656 KiB |
| 02_corner_1_10.txt | AC | 58 ms | 6624 KiB |
| 02_corner_1_11.txt | AC | 60 ms | 6620 KiB |
| 02_corner_1_12.txt | AC | 72 ms | 6668 KiB |
| 02_corner_1_13.txt | AC | 62 ms | 6616 KiB |
| 03_corner_2_00.txt | AC | 59 ms | 6676 KiB |
| 03_corner_2_01.txt | WA | 50 ms | 6620 KiB |
| 03_corner_2_02.txt | AC | 66 ms | 6624 KiB |
| 03_corner_2_03.txt | WA | 52 ms | 6648 KiB |
| 03_corner_2_04.txt | WA | 59 ms | 6608 KiB |
| 03_corner_2_05.txt | AC | 58 ms | 6676 KiB |
| 03_corner_2_06.txt | WA | 45 ms | 6664 KiB |
| 03_corner_2_07.txt | WA | 59 ms | 6764 KiB |
| 03_corner_2_08.txt | WA | 61 ms | 6668 KiB |
| 03_corner_2_09.txt | WA | 59 ms | 6624 KiB |
| 03_corner_2_10.txt | WA | 65 ms | 6676 KiB |
| 03_corner_2_11.txt | WA | 59 ms | 6628 KiB |
| 03_corner_2_12.txt | WA | 63 ms | 6676 KiB |
| 03_corner_2_13.txt | WA | 63 ms | 6592 KiB |
| 03_corner_2_14.txt | WA | 58 ms | 6656 KiB |
| 03_corner_2_15.txt | WA | 63 ms | 6700 KiB |
| 03_corner_2_16.txt | WA | 59 ms | 6624 KiB |
| 03_corner_2_17.txt | WA | 59 ms | 6676 KiB |
| 03_corner_2_18.txt | WA | 62 ms | 6660 KiB |
| 04_corner_3_00.txt | AC | 2 ms | 4044 KiB |
| 04_corner_3_01.txt | AC | 2 ms | 4028 KiB |
| 04_corner_3_02.txt | AC | 2 ms | 3848 KiB |
| 04_corner_3_03.txt | AC | 1 ms | 3860 KiB |
| 04_corner_3_04.txt | AC | 1 ms | 3888 KiB |
| 04_corner_3_05.txt | AC | 1 ms | 3800 KiB |
| 04_corner_3_06.txt | AC | 1 ms | 3796 KiB |
| 04_corner_3_07.txt | AC | 1 ms | 3780 KiB |
| 04_corner_3_08.txt | AC | 1 ms | 3848 KiB |
| 04_corner_3_09.txt | AC | 1 ms | 3796 KiB |
| 04_corner_3_10.txt | WA | 1 ms | 3824 KiB |
| 04_corner_3_11.txt | AC | 1 ms | 3852 KiB |
| 05_corner_4_00.txt | AC | 65 ms | 6624 KiB |
| 05_corner_4_01.txt | AC | 69 ms | 6692 KiB |
| 05_corner_4_02.txt | AC | 65 ms | 6640 KiB |
| 05_corner_4_03.txt | AC | 73 ms | 6676 KiB |
| 05_corner_4_04.txt | WA | 131 ms | 6688 KiB |
| 05_corner_4_05.txt | AC | 70 ms | 6624 KiB |
| 05_corner_4_06.txt | AC | 65 ms | 6676 KiB |
| 05_corner_4_07.txt | WA | 92 ms | 6676 KiB |
| 05_corner_4_08.txt | AC | 77 ms | 6668 KiB |
| 05_corner_4_09.txt | WA | 95 ms | 6644 KiB |
| 05_corner_4_10.txt | WA | 131 ms | 6676 KiB |
| 05_corner_4_11.txt | WA | 134 ms | 6672 KiB |
| 05_corner_4_12.txt | WA | 99 ms | 6520 KiB |
| 05_corner_4_13.txt | WA | 135 ms | 6620 KiB |
| 06_corner_5_00.txt | WA | 46 ms | 6672 KiB |
| 06_corner_5_01.txt | WA | 47 ms | 6624 KiB |
| 06_corner_5_02.txt | WA | 50 ms | 6672 KiB |
| 06_corner_5_03.txt | WA | 54 ms | 6632 KiB |
| 06_corner_5_04.txt | WA | 66 ms | 6672 KiB |
| 06_corner_5_05.txt | WA | 64 ms | 6636 KiB |
| 06_corner_5_06.txt | WA | 61 ms | 6696 KiB |
| 06_corner_5_07.txt | AC | 65 ms | 6596 KiB |
| 06_corner_5_08.txt | AC | 62 ms | 6660 KiB |
| 06_corner_5_09.txt | WA | 61 ms | 6520 KiB |
| 06_corner_5_10.txt | WA | 61 ms | 6696 KiB |
| 06_corner_5_11.txt | WA | 61 ms | 6640 KiB |
| 06_corner_5_12.txt | WA | 61 ms | 6668 KiB |
| 06_corner_5_13.txt | WA | 61 ms | 6680 KiB |
| 07_corner_6_00.txt | AC | 58 ms | 6680 KiB |
| 07_corner_6_01.txt | AC | 60 ms | 6732 KiB |
| 07_corner_6_02.txt | AC | 58 ms | 6680 KiB |
| 07_corner_6_03.txt | AC | 59 ms | 6764 KiB |
| 07_corner_6_04.txt | AC | 59 ms | 6676 KiB |
| 07_corner_6_05.txt | AC | 85 ms | 6664 KiB |
| 07_corner_6_06.txt | AC | 59 ms | 6520 KiB |
| 07_corner_6_07.txt | AC | 80 ms | 6672 KiB |
| 07_corner_6_08.txt | AC | 76 ms | 6672 KiB |
| 07_corner_6_09.txt | WA | 84 ms | 6668 KiB |
| 08_corner_7_00.txt | AC | 88 ms | 6660 KiB |
| 08_corner_7_01.txt | AC | 80 ms | 6760 KiB |
| 08_corner_7_02.txt | AC | 63 ms | 6768 KiB |
| 08_corner_7_03.txt | AC | 63 ms | 6672 KiB |
| 08_corner_7_04.txt | AC | 70 ms | 6700 KiB |
| 08_corner_7_05.txt | AC | 62 ms | 6520 KiB |
| 08_corner_7_06.txt | AC | 102 ms | 6772 KiB |
| 08_corner_7_07.txt | AC | 82 ms | 6680 KiB |
| 08_corner_7_08.txt | WA | 96 ms | 6692 KiB |