Submission #1203227

#TimeUsernameProblemLanguageResultExecution timeMemory
1203227LolkasMeepWiring (IOI17_wiring)C++20
0 / 100
0 ms328 KiB
#include "bits/stdc++.h"
using namespace std;
typedef long long int ll;

ll min_total_length(vector<int> r, vector<int> b){
    int n = r.size();
    int m = b.size();

    pair<ll, bool> big[n+m];
    auto comp = [](pair<ll, bool> a, pair<ll, bool> b) {
      	if(a.first < b.first) return true;
        if(a.first > b.first) return false;
        return a.second;
    };

    for(int i = 0; i < n; i++){
        big[i] = {r[i], true};
    }

    for(int i = 0; i < m; i++){
        big[i+n] = {b[i], false};
    }

    sort(big, big+n+m, comp);

    // for(int i = 0; i < n+m; i++){
    //     cout << big[i].first << " " << big[i].second << '\n';
    // }


    ll dp[n+m+5];
    fill(dp, dp+n+m+5, LLONG_MAX);
    dp[0] = 0;
    ll back = 0;
    for(int i = 0; i < n+m; i++){
        int j = i + 1;
        while(j < n+m && big[i].second == big[j].second) j++;
        //j is xclusive
        // cout << "block: " << i << ' ' << j << ' ' << back << '\n';
        
        if(i > 0){
            //connect previous
            for(int k = back; k < i; k++){
                // cout << "set " << dp[k+1] << ' ' << dp[k] + (big[i].first - big[k].first) << '\n';
                dp[k+1] = min(dp[k+1], dp[k] + (big[i].first - big[k].first));
            }
            
            //funny case in edtioral
            ll sm = 0;
            for (int k = i; k < j && 2*i-k-1 >= back; k++){
                sm += big[k].first-big[2*i-k-1].first;
                dp[k+1] = min(dp[k+1], dp[2*i-k-1] + sm);
            }
            
            //connect current
            for(int k = i; k < j; k++){
                dp[k+1] = min(dp[k+1], dp[k] + big[k].first - big[i-1].first);
            }
        }

        back = i;
        i = j;
    }

    // for(int i = 0; i < n+m; i++){
    //     cout << dp[i] << ' ';
    // }
    // cout << '\n';

    return dp[n+m];
}


// int main(){
//     int R[] = {1, 2, 3, 7};
//     int B[] = {0, 4, 5, 9, 10};
//     cout << min_total_length({1, 2, 3, 7}, {0, 4, 5, 9, 10}) << '\n';
//     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...