Advertisement
maxan

Untitled

Nov 13th, 2019
127
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.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef long double ld;
  7.  
  8. signed main() {
  9.     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  10. #ifdef LOCAL
  11.     FILE *f = freopen("input", "r", stdin);\
  12.     freopen("output", "w", stdout);
  13. #endif
  14.     int n, k;
  15.     cin >> n >> k;
  16.  
  17.  
  18.     int grid[2][n];
  19.     for (int i = 0; i < n; ++i) {
  20.         cin >> grid[0][i] >> grid[1][i];
  21.     }
  22.  
  23.     if (k == 0) {
  24.         for (int i = 0; i < n; ++i) {
  25.             cout << "0 0\n";
  26.         }
  27.     } else {
  28.         ll dp[n][k + 1][4];
  29.         int p[n][k + 1][4];
  30.         memset(p, -1, sizeof(p));
  31.  
  32.         for (int i = 0; i <= k; ++i) {
  33.             for (int j = 0; j < 4; ++j) {
  34.                 for (int q = 0; q < n; ++q)
  35.                     dp[q][i][j] = 2e18;
  36.                 p[0][i][j] = -1;
  37.             }
  38.         }
  39.  
  40.         dp[0][0][3] = grid[0][0] + grid[1][0];
  41.         for (int i = 1; i < n; ++i) {
  42.             dp[i][0][3] = dp[i - 1][0][3] + grid[0][i] + grid[1][i];
  43.         }
  44.         dp[0][1][0] = 0;
  45.  
  46.         for (int i = 1; i < n; ++i) {
  47.             for (int j = 1; j <= k; ++j) {
  48.                 for (int kk = 0; kk < 4; ++kk) {
  49.                     tie(dp[i][j][0], p[i][j][0]) = min(make_pair(dp[i - 1][j - 1][kk], kk),
  50.                                                        {dp[i][j][0], p[i][j][0]});
  51.                 }
  52.                 for (int kk: {2, 3}) {
  53.                     tie(dp[i][j][1], p[i][j][1]) = min(make_pair(dp[i - 1][j - 1][kk], kk),
  54.                                                        {dp[i][j][1], p[i][j][1]});
  55.                 }
  56.                 dp[i][j][1] += grid[1][i] - grid[0][i - 1];
  57.                 for (int kk: {1, 3}) {
  58.                     tie(dp[i][j][2], p[i][j][2]) = min(make_pair(dp[i - 1][j - 1][kk], kk),
  59.                                                        {dp[i][j][2], p[i][j][2]});
  60.                 }
  61.                 dp[i][j][2] += grid[0][i] - grid[1][i - 1];
  62.                 for (int kk: {0, 1, 2, 3}) {
  63.                     tie(dp[i][j][3], p[i][j][3]) = min(make_pair(dp[i - 1][j][kk], kk),
  64.                                                        {dp[i][j][3], p[i][j][3]});
  65.                 }
  66.                 dp[i][j][3] += grid[0][i] + grid[1][i];
  67.             }
  68.         }
  69.  
  70.         int res[2][n];
  71.         memset(res, 0, sizeof(res));
  72.  
  73.         int ind = n - 1, now, sum;
  74.         tie(sum, now) = min(make_pair(dp[n - 1][k][0], 0),
  75.                             min({dp[n - 1][k][1], 1},
  76.                                 min(make_pair(dp[n - 1][k][2], 2),
  77.                                     {dp[n - 1][k][3], 3})));
  78.  
  79.         int cnt = 1;
  80.         while (now != -1) {
  81.             if (now == 0)
  82.                 res[0][ind] = cnt, res[1][ind] = cnt;
  83.             if (now == 1)
  84.                 res[0][ind] = cnt, res[0][ind - 1] = cnt;
  85.             if (now == 2)
  86.                 res[1][ind] = cnt, res[1][ind - 1] = cnt;
  87.             int pcnt = cnt;
  88.             if (now == 3)
  89.                 cnt--;
  90.             cnt++;
  91.             now = p[ind][k - pcnt + 1][now];
  92.             ind--;
  93.         }
  94.  
  95.         for (int i = 0; i < n; ++i) {
  96.             for (int j = 0; j < 2; ++j) {
  97.                 cout << res[j][i] << " ";
  98.             }
  99.             cout << "\n";
  100.         }
  101.     }
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement