Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. bool v[4][4] = {
  6.     {1, 0, 1, 1},
  7.     {1, 0, 1, 1},
  8.     {0, 1, 0, 0},
  9.     {1, 0, 1, 1}
  10. };
  11.  
  12. bool valid(int mcur, int mprev) {
  13.     int m1, m2;
  14.     if (mcur==15) {
  15.         m1 = 3, m2 = 3;
  16.     }
  17.     else m1 = mcur / 3, m2 = mcur % 3;
  18.     int m3 = mprev / 4, m4 = mprev % 4;
  19.     return (v[m1][m3] && v[m2][m4]);
  20. }
  21.  
  22. signed main() {
  23.     ios::sync_with_stdio(0);
  24.     cin.tie(0);
  25.     int n, k;
  26.     cin >> n >> k;
  27.     int dp[n + 1][k + 1][4][4] = {};
  28.     memset(dp, -100, sizeof dp);
  29.     dp[0][0][0][0] = 0;
  30.     pair<int, int> from[n + 1][k + 1][4][4] = {};
  31.     int arr[n + 1][2] = {}, ans[n + 1][2] = {};
  32.     for (int i = 1; i <= n; i++) {
  33.         cin >> arr[i][0] >> arr[i][1];
  34.         arr[i][0] += INT_MAX;
  35.         arr[i][1] += INT_MAX;
  36.     }
  37.     for (int i = 1; i <= n; i++) {
  38.         for (int d = 0; d <= k; d++) {
  39.             for (int mcur = 0; mcur < 9; mcur++) {
  40.                 for (int mprev = 0; mprev < 16; mprev++) {
  41.                     if ((mprev % 4 == 3 && mprev / 4 != 3) || (mprev / 4 != 3 && mprev % 4 == 3)) continue;
  42.                     int m1 = mcur / 3, m2 = mcur % 3;
  43.                     int add = (m1 == 2) + (m2 == 2);
  44.                     if (add > d) continue;
  45.                     int s = 0;
  46.                     if (m1) s += arr[i][0];
  47.                     if (m2) s += arr[i][1];
  48.                     if (valid(mcur, mprev)) {
  49.                         if (dp[i - 1][d - add][mprev / 4][mprev % 4] + s > dp[i][d][m1][m2]) {
  50.                             from[i][d][m1][m2] = {d - add, mprev};
  51.                             dp[i][d][m1][m2] = dp[i - 1][d - add][mprev / 4][mprev % 4] + s;
  52.                         }
  53.                     }
  54.                 }
  55.             }
  56.             for (int mprev = 0; mprev < 16; mprev++) {
  57.                 if ((mprev % 4 == 3 && mprev / 4 != 3) || (mprev / 4 != 3 && mprev % 4 == 3)) continue;
  58.                 if (!d) continue;
  59.                 if (valid(15, mprev)) {
  60.                     if (dp[i - 1][d - 1][mprev / 4][mprev % 4] + arr[i][0] + arr[i][1] > dp[i][d][3][3]) {
  61.                         from[i][d][3][3] = {d - 1, mprev};
  62.                         dp[i][d][3][3] = dp[i - 1][d - 1][mprev / 4][mprev % 4] + arr[i][0] + arr[i][1];
  63.                     }
  64.                 }
  65.             }
  66.  
  67.         }
  68.     }
  69.     int maxans = 0;
  70.     pair<int, int> start;
  71.     for (int i = 0; i < 16; i++) {
  72.         if (i % 4 == 1 || i / 4 == 1) continue;
  73.         if (dp[n][k][i / 4][i % 4] > maxans) {
  74.              maxans = dp[n][k][i / 4][i % 4];
  75.              start = {k, i};
  76.         }
  77.     }
  78.     int q = 1;
  79.     int qty = start.first, msk = start.second;
  80.     if (msk / 4 == 2) ans[n][0] = ans[n - 1][0] = q, q++;
  81.     if (msk / 4 == 3) ans[n][0] = ans[n][1] = q, q++;
  82.     if (msk % 4 == 2) ans[n][1] = ans[n - 1][1] = q, q++;
  83.     for (int i = n - 1; i >= 1; i--) {
  84.         start = from[i + 1][qty][msk / 4][msk % 4];
  85.         qty = start.first, msk = start.second;
  86.         if (msk / 4 == 2) ans[i][0] = ans[i - 1][0] = q, q++;
  87.         if (msk / 4 == 3) ans[i][0] = ans[i][1] = q, q++;
  88.         if (msk % 4 == 2) ans[i][1] = ans[i - 1][1] = q, q++;
  89.     }
  90.     for (int i = 1; i <= n; i++) {
  91.         cout << ans[i][0] << " " << ans[i][1] << "\n";
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement