Submission #1351531

#TimeUsernameProblemLanguageResultExecution timeMemory
1351531nerrrminDeveloper (BOI25_dev)C++20
17 / 100
1501 ms161168 KiB
#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
using namespace std;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
long long n, a[2005];
long long dp[2005][6005][3], pref[2005][6005][3];
unordered_map < long long, long long > code, decode;
long long t[6000 * 4][3];
long long cpos;
void build(long long i, long long l, long long r, long long type)
{
    if(l == r)
    {
        t[i][type] = dp[cpos][l][type];
        return;
    }
    long long mid = (l + r)/2;
    build(2*i, l, mid, type);
    build(2*i+1, mid+1, r, type);
    t[i][type] = min(t[2*i][type], t[2*i+1][type]);
}
long long ql, qr;
long long query(long long i, long long l, long long r, long long type)
{
    //cout << i << " ---  " << l << " " << type << endl;
    if(qr < ql)return 1e17;
    if(qr < l || ql > r)return 1e17;
    if(ql <= l && r <= qr)return t[i][type];
    long long mid = (l + r)/2;
    return min(query(2*i, l, mid, type), query(2*i+1, mid+1, r, type));
}
int main()
{
    speed();
    vector < long long > g;
    cin >> n;
    for (long long i = 1; i <= n; ++ i)
    {
        cin >> a[i];
        g.pb(a[i]);
        g.pb(a[i]-1);
        g.pb(a[i+1]);
    }
    sort(g.begin(), g.end());
    long long cnt = 0;
    long long last = -1;
    for (long long i = 0; i < g.size(); ++ i)
    {
        if(last == g[i])continue;
        code[g[i]] = cnt;
        decode[cnt] = g[i];
        cnt ++;
        last = g[i];
    }
  for (long long i = 1; i <= n; ++ i)
  {
      for (long long j = 0; j < cnt; ++ j)
      {
          for (long long t = 0; t <= 2; ++ t)
            dp[i][j][t] = 1e17;
      }
  }
  long long best = 1e17;
   for (long long i = 0; i < cnt; ++ i)
   {
       dp[1][i][0] = abs(decode[i] - a[1]);
   }
   cpos = 1;
       for (long long t = 0; t < 3; ++ t)
       {

           build(1, 0, cnt-1, t);

       }
   for (long long i = 2; i <= n; ++ i)
   {
       for (long long h = 0; h < cnt; ++ h)
       {
           for (long long t = 0; t <= 2; ++ t)
           {

               dp[i][h][t] = min(dp[i][h][t], dp[i-1][h][t] + abs(a[i] - decode[h]));
               if(t == 1)
               {
                   ql = h+1;
                   qr = cnt-1;

                    dp[i][h][t] = min(dp[i][h][t], 1LL * min(query(1, 0, cnt-1, 2), query(1, 0, cnt-1, 0)) + abs(a[i] - decode[h]));
               }
               else if(t == 2)
               {
                   ql = 0;
                   qr = h-1;

                   dp[i][h][t] = min(dp[i][h][t], 1LL * min(query(1, 0, cnt-1, 1), query(1, 0, cnt-1, 0)) + abs(a[i] - decode[h]));
               }

           }

       }
      // cout << "ended " << i << endl;
       cpos = i;
       for (long long t = 0; t < 3; ++ t)
       {

           build(1, 0, cnt-1, t);
           //cout << "done " << t << endl;
       }


      // cout << "ended again " << i << endl;
   }
   for (long long h = 0; h <= cnt-1; ++ h)
   {
       for (long long t = 0; t < 3; ++ t)
    {
        best = min(best, dp[n][h][t]);

    }
   }

    cout << best << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...