Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. long long powmod(long long a,long long b,long long mod) {
  5. if (b==0 || a==1) {if (mod==1) return 0; else return 1; }
  6.  
  7. if (b%2==0) { long long k=powmod(a,b/2,mod); return (k*k)%mod; }
  8. else {long long k=powmod(a,b/2,mod); return ( (k*k) %mod *a)% mod; }
  9. }
  10. long long gcd(long long a, long long b) {
  11. if (a==0) return b;
  12. if (b==0) return a;
  13. if (a>b) return gcd(a%b,b); else return gcd(b%a,a);
  14. }
  15. int prime(int p) { // 1 - простое
  16. for (int i=2;i*i<=p;i++) {
  17. if (p%i==0 && i<p) return i;
  18. }
  19. return 1;
  20. }
  21. long long sqr(long long i) {
  22. return i*i;
  23. }
  24.  
  25. void solve () {
  26.  
  27.  
  28. /* --------- */
  29.  
  30. int a,b;
  31. cin>>a>>b;
  32. int m[2][a];
  33.  
  34.  
  35. for (int i=0;i<a;i++) {
  36. cin>>m[0][i]>>m[1][i];
  37.  
  38. }
  39. int dp[a][4][b+1];
  40. for (int i=0;i<a;i++) {
  41. for (int j=0;j<4;j++) {
  42. for (int k=0;k<=b;k++) dp[i][j][k]=-1000000000000000;
  43. }
  44. }
  45. dp[0][0][0]=0;
  46. pair<int,pair<int,int>> from[a][4][b+1];
  47. dp[0][3][1]=m[0][0]+m[1][0];
  48. for (int i=1;i<a;i++) {
  49.  
  50. for (int k=0;k<=min(b,i+1);k++) {
  51. dp[i][0][k]=dp[i-1][0][k]; from[i][0][k]={i-1,{0,k}};
  52. if (dp[i-1][1][k]>dp[i][0][k]) {dp[i][0][k]=dp[i-1][1][k]; from[i][0][k]={i-1,{1,k}};}
  53. if (dp[i-1][2][k]>dp[i][0][k]) {dp[i][0][k]=dp[i-1][2][k]; from[i][0][k]={i-1,{2,k}};}
  54. if (dp[i-1][3][k]>dp[i][0][k]) {dp[i][0][k]=dp[i-1][3][k]; from[i][0][k]={i-1,{3,k}};}
  55.  
  56. if (k>=1) { dp[i][1][k]=max(dp[i-1][2][k-1],dp[i-1][0][k-1])+m[0][i]+m[0][i-1];
  57. if (dp[i-1][2][k-1]>dp[i-1][0][k-1]) from[i][1][k]={i-1,{2,k-1}}; else from[i][1][k]={i-1,{0,k-1}}; }
  58.  
  59.  
  60. if (k>=1) { dp[i][2][k]=max(dp[i-1][1][k-1],dp[i-1][0][k-1])+m[1][i]+m[1][i-1];
  61. if (dp[i-1][1][k-1]>dp[i-1][0][k-1]) from[i][2][k]={i-1,{1,k-1}}; else from[i][2][k]={i-1,{0,k-1}};
  62. }
  63. if (k>=1) { dp[i][3][k]=max({dp[i-1][0][k-1],dp[i-1][1][k-1],dp[i-1][2][k-1],dp[i-1][3][k-1]})+m[0][i]+m[1][i];
  64. int qq=max({dp[i-1][0][k-1],dp[i-1][1][k-1],dp[i-1][2][k-1],dp[i-1][3][k-1]});
  65. if (dp[i-1][0][k-1]==qq) from[i][3][k]={i-1,{0,k-1}};
  66. if (dp[i-1][1][k-1]==qq) from[i][3][k]={i-1,{1,k-1}};
  67. if (dp[i-1][2][k-1]==qq) from[i][3][k]={i-1,{2,k-1}};
  68. if (dp[i-1][3][k-1]==qq) from[i][3][k]={i-1,{3,k-1}};
  69. }
  70.  
  71. }
  72.  
  73.  
  74.  
  75. }
  76.  
  77.  
  78. int ans[2][a];
  79. for (int i=0;i<2;i++) for (int j=0;j<a;j++) ans[i][j]=0;
  80. int qq=max({dp[a-1][0][b],dp[a-1][1][b],dp[a-1][2][b],dp[a-1][3][b]});
  81. // cout<<qq<<" ";
  82. int curk=b;
  83. int curprof=0;
  84. if (dp[a-1][0][b]==qq) curprof=0;
  85. if (dp[a-1][1][b]==qq) curprof=1;
  86. if (dp[a-1][2][b]==qq) curprof=2;
  87. if (dp[a-1][3][b]==qq) curprof=3;
  88.  
  89. for (int i=a-1;i>=1;i--) {
  90. if (curprof==0) {
  91. curprof=from[i][0][curk].second.first;
  92. } else if (curprof==1) {
  93. curprof=from[i][1][curk].second.first;
  94. ans[0][i]=curk;
  95. ans[0][i-1]=curk;
  96. curk--;
  97. }
  98. else if (curprof==2) {
  99. curprof=from[i][2][curk].second.first;
  100. ans[1][i]=curk;
  101. ans[1][i-1]=curk;
  102. curk--;
  103. } else if (curprof==3) {
  104. curprof=from[i][3][curk].second.first;
  105. ans[0][i]=curk; ans[1][i]=curk;
  106. curk--;
  107. }
  108.  
  109. }
  110. if (curk>=1) { ans[0][0]=1; ans[1][0]=1; }
  111. for (int i=0;i<a;i++) cout<<ans[0][i]<<" "<<ans[1][i]<<"\n";
  112. /* --------- */
  113. return;
  114. }
  115.  
  116.  
  117.  
  118. signed main() {
  119.  
  120. ios_base::sync_with_stdio(0);
  121. cin.tie(0);
  122. cout.tie(0);
  123.  
  124.  
  125.  
  126. int tututu;
  127. tututu=1;
  128. // cin>>tututu; // если нет запросов, то закоментить
  129. for (int qwerty=0;qwerty<tututu;qwerty++) solve();
  130.  
  131.  
  132. return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement