Submission #1342265

#TimeUsernameProblemLanguageResultExecution timeMemory
1342265iamhereforfunWiring (IOI17_wiring)C++20
100 / 100
41 ms11364 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

using namespace std;

#define LSOne(X) ((X) & -(X))

const int N = 4e5 + 5;
const int M = 1e6 + 5;
const int K = 20;
const int LG = 20;
const long long INF = 1e18 + 5;
const int C = 26;
const int B = 1000;
const int MOD = 998244353;

int last[2][N], nxt[2][N], l[2], lev[N], cur;
long long s[N], dp[N];

long long min_total_length(vector<int> r, vector<int> b)
{
    int n = r.size(), m = b.size();
    vector<pair<int, int>> v;
    for (int i : r)
    {
        v.push_back({i, 0});
    }
    for (int i : b)
    {
        v.push_back({i, 1});
    }
    sort(v.begin(), v.end());
    l[0] = l[1] = -1;
    for (int x = 1; x <= n + m; x++)
    {
        last[0][x] = l[0];
        last[1][x] = l[1];
        l[v[x - 1].second] = v[x - 1].first;
    }
    l[0] = l[1] = -1;
    for (int x = n + m; x >= 1; x--)
    {
        nxt[0][x] = l[0];
        nxt[1][x] = l[1];
        l[v[x - 1].second] = v[x - 1].first;
    }
    cur = n + m;
    memset(lev, -1, sizeof(lev));
    lev[n + m] = 0;
    s[0] = 0;
    // for (int x = 1; x <= n + m; x++)
    // {
    //     cout << last[0][x] << " " << last[1][x] << " " << nxt[0][x] << " " << nxt[1][x] << " " << x << "\n";
    // }
    for (int x = 1; x <= n + m; x++)
    {
        dp[x] = INF;
        auto [p, t] = v[x - 1];
        s[x] = s[x - 1];
        if (t == 1)
        {
            cur++;
            s[x] += p;
        }
        else
        {
            cur--;
            s[x] -= p;
        }
        if (last[!t][x] != -1)
        {
            dp[x] = min(dp[x], dp[x - 1] + p - last[!t][x]);
        }
        if (nxt[!t][x] != -1)
        {
            dp[x] = min(dp[x], dp[x - 1] + nxt[!t][x] - p);
        }
        if (lev[cur] != -1)
        {
            dp[x] = min(dp[x], dp[lev[cur]] + abs(s[x] - s[lev[cur]]));
        }
        lev[cur] = x;
        // cout << dp[x] << " " << x << "\n";
    }
    return dp[n + m];
}
#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...