Guest User

Untitled

a guest
Jan 11th, 2020
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int ll;
  4. #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  5. #define INF LLONG_MAX
  6.  
  7. int main()
  8. {
  9.     fastio;
  10.  
  11.     ll test;
  12.     cin >> test;
  13.  
  14.     for( ll t = 1 ; t <= test ; t++)
  15.     {
  16.         ll n,m,flag=0,flaag = 0,flaaag = 0;
  17.  
  18.  
  19.         cin >> n >> m;
  20.  
  21.         vector<ll> q(n+5);
  22.         vector<pair<ll,ll>> publictp(m+5);
  23.         vector<ll> visitedp(m+5);
  24.         vector<ll> pge(m+5);
  25.         vector<vector<ll>> dp(n+5, vector<ll>(m+5));
  26.  
  27.         for( ll i = 1 ; i <= n ; i++)
  28.         {
  29.             cin >> q[i];
  30.         }
  31.  
  32.         for( ll i = 1 ; i <= m ; i++)
  33.         {
  34.             cin >> publictp[i].second;
  35.         }
  36.  
  37.         for( ll i = 1 ; i <= m ; i++)
  38.         {
  39.             cin >> publictp[i].first;
  40.         }
  41.  
  42.         sort(publictp.begin()+1 , publictp.begin()+m+1);
  43.  
  44.         dp[0][0]=0;
  45.  
  46.         for( ll i = 1 ; i <= m ; i++)
  47.         {
  48.             if( dp[0][i-1] < publictp[i].first - publictp[i].second +1)
  49.             {
  50.                 dp[0][i] = publictp[i].first;
  51.             }
  52.  
  53.             else if(dp[0][i-1] >= publictp[i].first - publictp[i].second +1  && dp[0][i-1] < publictp[i].first)
  54.             {
  55.                 dp[0][i] = dp[0][i-1]+publictp[i].second;
  56.             }
  57.  
  58.             else{
  59.                 flag = 1;
  60.                 break;
  61.             }
  62.         }
  63.  
  64.         if( flag == 1)
  65.         {
  66.             cout << -1 << "\n" ;
  67.             break;
  68.         }
  69.  
  70.         flag = 0;
  71.  
  72.         for( ll i = 1 ; i <= n ; i++)
  73.         {
  74.             dp[i][0] = dp[i-1][0] + q[i];
  75.         }
  76.  
  77.         for( ll i = 1 ; i <= n ; i++)
  78.         {
  79.             flag = 0;
  80.             ll v = i;
  81.             for( ll j = 1 ; j <= m ; j++)
  82.             {
  83.                 v=i;
  84.                 if(!visitedp[j])
  85.                 {
  86.                     if( dp[i][j-1]< publictp[j].first)
  87.                     {
  88.                         if(dp[i][j-1] < publictp[j].first - publictp[j].second+1)
  89.                         {
  90.                             dp[i][j] = publictp[j].first;
  91.                         }
  92.  
  93.                         else
  94.                         {
  95.                             dp[i][j] = dp[i][j-1]+publictp[j].second;
  96.                         }
  97.                     }
  98.  
  99.                     else
  100.                     {
  101.                         while(v >= 0)
  102.                         {
  103.                             if (dp[v][j - 1] < publictp[j].first) {
  104.                                 dp[i][j] = dp[v][j] + dp[i][0] - dp[v][0];
  105.                                 pge[j] = v;
  106.                                 visitedp[j] = true;
  107.                                 flag = 2;
  108.                                 break;
  109.                             }
  110.                             v--;
  111.                         }
  112.  
  113.                         if(flag!= 2)
  114.                         {
  115.                            flaag = 10;
  116.                            break;
  117.                         }
  118.                     }
  119.                 }
  120.  
  121.                 else if(visitedp[j])
  122.                 {
  123.                     dp[i][j] = dp[pge[j]][j] + dp[i][0] - dp[pge[j]][0];
  124.                 }
  125.             }
  126.  
  127.             if( flaag == 10)
  128.             {
  129.                 flaag = 0;
  130.                 flaaag = 10;
  131.                 break;
  132.             }
  133.         }
  134.  
  135.         if( flaaag == 10)
  136.         {
  137.             cout << -1 << "\n";
  138.             flaaag = 0;
  139.             break;
  140.         }
  141.  
  142.         cout << dp[n][m] << "\n";
  143.  
  144. //        for( ll i = 0 ; i <= n ; i++)
  145. //        {
  146. //            for (ll j = 0 ; j <= m; j++)
  147. //            {
  148. //                cout << dp[i][j] << " ";
  149. //            }
  150. //            cout << endl;
  151. //        }
  152.  
  153.     }
  154.     return 0;
  155. }
Add Comment
Please, Sign In to add comment