제출 #1166578

#제출 시각아이디문제언어결과실행 시간메모리
1166578Boycl07전선 연결 (IOI17_wiring)C++20
100 / 100
46 ms7460 KiB
#include "wiring.h"
#include "bits/stdc++.h"

using namespace std;

#define ll long long
#define rep(i, n) for(int i = 1; i <= (n); ++i)
#define REP(i, n) for(int i = 0; i < (n); ++i)
#define forn(i, l, r) for(int i = (l); (i) <= (r); ++i)
#define ford(i, r, l) for(int i = (r); (i) >= (l); --i)
#define endl "\n"
#define fi first
#define se second
#define pb push_back
#define pll pair<ll, ll>
#define pii pair<int, int>
#define all(a) a.begin(), a.end()
#define sz(a) (int)(a.size())
#define task "note"

template<typename T> bool maximize(T &res, const T &val) {if(res < val) {res = val; return 1;} return 0;}
template<typename T> bool minimize(T &res, const T &val) {if(res < val) return 0; res = val; return 1;}
inline int readInt()       {char c;while(c=getchar(),c!='-'&&(c<'0'||c>'9'));bool sign=(c=='-');if(sign)c=getchar();int n=c-'0';while(c=getchar(),c>='0'&&c<='9')n=10*n+c-'0';return(!sign)?n:-n;}
inline ll readLong()       {char c;while(c=getchar(),c!='-'&&(c<'0'||c>'9'));bool sign=(c=='-');if(sign)c=getchar();ll  n=c-'0';while(c=getchar(),c>='0'&&c<='9')n=10*n+c-'0';return(!sign)?n:-n;}
inline string readString() {char c;while(c=getchar(),c==' '||c=='\n'||c=='\t');string s({c});while(c=getchar(),c!=EOF&&c!=' '&&c!='\n'&&c!='\t')s+=c;return s;}
const int N = 5000 + 3;
const int LOG = 12;
const int INF = 2e9;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
double get_cur_time() {return chrono::steady_clock::now().time_since_epoch().count();}



ll min_total_length(vector<int> r, vector<int> b)
{
    vector<pii> a;

    for(int x : r) a.pb({x, 0});
    for(int x : b) a.pb({x, 1});
    vector<int> dist(sz(a) + 1, INF);
    sort(all(a));
    for(int i = 1, lst = -1; i <= sz(a); ++i)
    {
        if(i > 1 && a[i - 1].se != a[i - 2].se) lst = i - 1;
        if(lst != -1) minimize(dist[i], abs(a[i - 1].fi - a[lst - 1].fi));
    }
    for(int i = sz(a), lst = -1; i >= 1; --i)
    {
        if(i < sz(a) && a[i - 1].se != a[i].se) lst = i + 1;
        if(lst != -1) minimize(dist[i], abs(a[i - 1].fi - a[lst - 1].fi));
    }
    vector<ll> pre(sz(a) + 1, 0);
    vector<ll> dp(sz(a) + 1, 0);
    for(int i = 1; i <= sz(a); ++i) pre[i] = pre[i - 1] + a[i - 1].fi;
    function<ll(int, int)> get_sum = [&](int l, int r) {
        return pre[r] - pre[l - 1];
    };
//    for(int i = 1; i <= sz(a); ++i)
//    {
//        cout << a[i - 1].fi << " " << a[i - 1].se << " " << dist[i] << endl;
//    }
    for(int i = 1, lst = 1; i <= sz(a); ++i)
    {
        int j = i;
        while(j <= sz(a) && a[j - 1].se == a[i - 1].se) ++j;
        --j;
        for(int k = i; k <= j; ++k)
        {
            dp[k] = dp[k - 1] + dist[k];
            int x = 2 * i - k - 1;
            if(x >= lst) minimize(dp[k], dp[x - 1] + get_sum(i, k) - get_sum(x, i - 1));
        }
        lst = i;
        i = j;
    }

    return dp[sz(a)];
}
#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...