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
AC × 4
WA × 2
AC × 72
WA × 46
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