Advertisement
Dang_Quan_10_Tin

arrange

Nov 11th, 2020
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #pragma GCC target ("avx2")
  2. #pragma GCC optimization ("O3")
  3. #pragma GCC optimization ("unroll-loops")
  4. #include <iostream>
  5. #include <cstdio>
  6. #define task ""
  7. using namespace std;
  8. using ll = long long;
  9. using ld = long double;
  10.  
  11. const int N = 2e3 + 2;
  12. int n;
  13. const ll Inf = 1e17;
  14. ll m, dp[N][N];
  15. ll pre[N][N];
  16. ll suf[N][N];
  17. ll a[N];
  18.  
  19. void Read(){
  20.     cin >> m >> n;
  21.     for(int i = 1; i <= n; ++i)
  22.         cin >> a[i],
  23.         a[i] += a[i - 1];
  24.  
  25. }
  26.  
  27. inline ll f(int i, int j){
  28.     return a[i] - a[j - 1] + i - j;
  29. }
  30.  
  31. void Solve(){
  32.     fill_n(&dp[0][0], N * N, Inf);
  33.     for(int i = 1; i <= n; ++i){
  34.         for(int j = 1; j <= i; ++j)
  35.             if(f(i, j) <= m){
  36.                 if(j == 1) dp[i][j] = 0;
  37.                 else{
  38.                     int low = 1, mid, high = j - 1;
  39.                     while(low <= high){
  40.                         mid = (low + high) / 2;
  41.                         if(f(j - 1, mid) <= f(i, j)) high = mid - 1;
  42.                         else low = mid + 1;
  43.                     }
  44.                     if(high > 0)
  45.                         dp[i][j] = pre[j - 1][high] - f(i, j);
  46.                     if(low < j)
  47.                         dp[i][j] = min(dp[i][j], suf[j - 1][low] + f(i, j));
  48.                 }
  49.             }
  50.         pre[i][0] = suf[i][i + 1] = Inf;
  51.         for(int j = 1; j <= i; ++j)
  52.             pre[i][j] = min(pre[i][j - 1], dp[i][j] + f(i, j));
  53.         for(int j = i; j; --j)
  54.             suf[i][j] = min(suf[i][j + 1], dp[i][j] - f(i, j));
  55.     }
  56.     ll ans = Inf;
  57.     for(int i = 1; i <= n; ++i)
  58.         ans = min(ans, dp[n][i]);
  59.     cout << ans;
  60. }
  61.  
  62. int32_t main() {
  63.     ios_base::sync_with_stdio(0);
  64.     cin.tie(0);
  65.     cout.tie(0);
  66.     if(fopen(task".INP", "r")){
  67.         freopen(task".INP", "r", stdin);
  68.         freopen(task".OUT", "w", stdout);
  69.     }
  70.     Read();
  71.     Solve();
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement