Submission #406703

#TimeUsernameProblemLanguageResultExecution timeMemory
406703wiwihoWiring (IOI17_wiring)C++14
7 / 100
541 ms3520 KiB
#include "wiring.h"

#include<bits/stdc++.h>

#define printv(a, b) { \
    for(auto pv : a) b << pv << " "; \
    b << "\n"; \
}
#define mp make_pair
#define F first
#define S second
#define iter(a) a.begin(), a.end()
#define lsort(a) sort(iter(a))
#define eb emplace_back

using namespace std;

typedef long long ll;

using pii = pair<int, int>;

const ll MAX = 1LL << 60;

ostream& operator<<(ostream& o, pii p){
    return o << '(' << p.F << ',' << p.S << ')';
}

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

    assert(n <= 200);

    vector<pii> a;
    for(int i : r) a.eb(mp(i, 0));
    for(int i : b) a.eb(mp(i, 1));
    lsort(a);

    vector<vector<ll>> dp(n + m + 1, vector<ll>(n + m + 1, MAX));
    dp[0][0] = 0;

    ll lst = a[0].F;
    for(pii now : a){
        vector<vector<ll>> dp2(n + m + 1, vector<ll>(n + m + 1, MAX));
        for(int i = 0; i <= n + m; i++){
            for(int j = 0; j <= n + m; j++){
                if(dp[i][j] == MAX) continue;
                dp[i][j] += (ll)(i + j) * (now.F - lst);
            }
        }
        if(now.S == 0){
            for(int i = 0; i <= n + m; i++){
                for(int j = n + m; j > 0; j--){
                    dp2[i][j - 1] = min({dp2[i][j - 1], dp[i][j], dp2[i][j]});
                }
            }
            for(int i = 0; i < n + m; i++){
                for(int j = 0; j <= n + m; j++){
                    dp2[i + 1][j] = min({dp2[i + 1][j], dp[i][j], dp2[i][j]});
                }
            }
        }
        else{
            for(int i = n + m; i > 0; i--){
                for(int j = 0; j <= n + m; j++){
                    dp2[i - 1][j] = min({dp2[i - 1][j], dp[i][j], dp2[i][j]});
                }
            }
            for(int i = 0; i <= n + m; i++){
                for(int j = 0; j < n + m; j++){
                    dp2[i][j + 1] = min({dp2[i][j + 1], dp[i][j], dp2[i][j]});
                }
            }
        }
        dp = dp2;
        lst = now.F;
        //cerr << "test " << now.F << " " << now.S << "\n";
        //for(int i = 0; i <= n; i++) printv(dp[i], cerr);
    }

	return dp[0][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...