Advertisement
Korotkodul

div2_C_16.07

Jul 16th, 2022 (edited)
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. #define vec vector
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. using db = double;
  16. void cv(vector <int> &v){
  17.     for (auto x: v) cout<<x<<' ';
  18.     cout<<"\n";
  19. }
  20.  
  21. void cvl(vector <ll> &v){
  22.     for (auto x: v) cout<<x<<' ';
  23.     cout<<"\n";
  24. }
  25.  
  26.  
  27. void cvv(vector <vector <int> > &v){
  28.     for (auto x: v) cv(x);
  29.     cout<<"\n";
  30. }
  31.  
  32. void cvb(vector <bool> v){
  33.     for (bool x: v) cout<<x<<' ';
  34.     cout<<"\n";
  35. }
  36.  
  37. void cvs(vector <string>  v){
  38.     for (auto a: v){
  39.         cout<<a<<"\n";
  40.     }
  41. }
  42.  
  43. bool sh=0;
  44.  
  45. int main()
  46. {
  47.     ios::sync_with_stdio(0);
  48.     cin.tie(0);
  49.     cout.tie(0);
  50.     int t=1;
  51.     if (!sh) cin>>t;
  52.     for (int go=0;go<t;++go){
  53.         int n,q; cin>>n>>q;
  54.         vector <int> a(n); for (int &i: a) cin>>i;
  55.         vector <vector <pii> > dp(n, vector <pii>(2));
  56.         dp[0][0] = {1,q};
  57.         if (q < a[0]){
  58.             dp[0][0] = {1, q-1};
  59.         }
  60.         dp[0][1] = {0,q};
  61.         vector <vector<int>> way(n, vector <int>(2,-1));//j=0<->taken on (i-1) ; j = 1 <-> skip on (i-1)
  62.  
  63.         for (int i = 1; i < n; ++i){
  64.             //take
  65.             //A
  66.             int A=-1,B,C=-1,D, qA, qB, qC, qD;
  67.  
  68.             A = dp[i-1][0].first + 1;
  69.             qA = dp[i-1][0].second;
  70.             if (dp[i-1][0].second < a[i]) qA--;
  71.             //B
  72.             B = dp[i-1][1].first + 1;
  73.             qB = dp[i-1][1].second;
  74.             if (dp[i-1][1].second < a[i]) qB--;
  75.  
  76.             if (dp[i-1][0].second > 0 && dp[i-1][1].second > 0){
  77.                 if (A > B){
  78.                     dp[i][0] = {A, qA};
  79.                 }
  80.                 else{
  81.                     dp[i][0] = {B, qB};
  82.                 }
  83.             }
  84.             else if (dp[i-1][0].second > 0){
  85.                 dp[i][0] = {A, qA};
  86.             }
  87.             else if (dp[i-1][1].second > 0){
  88.                 dp[i][0] = {B, qB};
  89.             }
  90.             else{
  91.                 dp[i][0] = dp[i-1][0];
  92.             }
  93.  
  94.             if (dp[i][0] == pii{A, qA}){
  95.                 way[i][0] = 0;
  96.             }
  97.             else {
  98.                 way[i][0] = 1;
  99.             }
  100.  
  101.             //skip
  102.             //C
  103.             C = dp[i-1][0].first;
  104.             qC = dp[i-1][0].second;
  105.             D = dp[i-1][1].first;
  106.             qD = dp[i-1][1].second;
  107.             if (C > D){
  108.                 dp[i][1] = {C, qC};
  109.                 way[i][1] = 0;
  110.             }
  111.             else{
  112.                 dp[i][1] = {D, qD};
  113.                 way[i][1] = 1;
  114.             }
  115.  
  116.  
  117.         }
  118.  
  119.         if (sh){
  120.             cout<<"dp\n";
  121.             for (int i = 0; i < n; ++i){
  122.                 for (int j = 0; j < 2; ++j){
  123.                     cout<<"("<<dp[i][j].first<<","<<dp[i][j].second<<") ";
  124.                 }
  125.                 cout<<"\n";
  126.             }
  127.             cout<<"\n";
  128.         }
  129.  
  130.         string ans;
  131.         int j;
  132.         if (dp[n-1][0].first > dp[n-1][1].first){
  133.             ans += '1';
  134.             j=0;
  135.         }
  136.         else{
  137.             ans += '0';
  138.             j=1;
  139.         }
  140.  
  141.         for (int i=n-1;i>0;--i){
  142.             if (way[i][j] == 0){
  143.                 ans += '1';
  144.                 j = 0;
  145.             }
  146.             else {
  147.                 ans += '0';
  148.                 j = 1;
  149.             }
  150.         }
  151.  
  152.  
  153.         //if (!sh)
  154.         reverse(ans.begin(), ans.end());
  155.         if (sh) cout<<"ans\n";
  156.         cout<<ans<<"\n";
  157.     }
  158. }
  159. /*
  160. 2 1
  161. 1 2
  162.  
  163. */
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement