Submission #1203043

#TimeUsernameProblemLanguageResultExecution timeMemory
1203043onbertRoller Coaster Railroad (IOI16_railroad)C++20
34 / 100
551 ms589824 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;

bool cmp(int a, int b) {
    int A = 0, B = 0;
    for (int i=0;i<20;i++) {
        if (a & (1<<i)) A++;
        if (b & (1<<i)) B++;
    }
    return (A < B);
}

long long plan_roller_coaster(std::vector<int32_t> s, std::vector<int32_t> t) {
    int n = s.size(), N = (1<<n);

    int ans1 = 0;
    map<int,int> mp;
    for (int i=0;i<n;i++) {
        mp[s[i]]--;
        mp[t[i]]++;
    }
    int val = 0;
    for (auto [x, y]:mp) {
        val += y;
        if (val < 0) ans1 = 1;
    }

    int dist[N][n];
    for (int i=0;i<N;i++) for (int j=0;j<n;j++) dist[i][j] = INF;
    dist[0][0] = 0;
    vector<int> vals;
    for (int i=0;i<N;i++) vals.push_back(i);
    sort(vals.begin(), vals.end(), cmp);
    for (int i:vals) {
        for (int j=0;j<n;j++) if (i & (1<<j) || i==0) {
            for (int k=0;k<n;k++) if (!(i & (1<<k))) {
                int v = (i | (1<<k)), inc = max(t[j] - s[k], 0);
                if (i==0) inc = 0;
                dist[v][k] = min(dist[i][j] + inc, dist[v][k]);
            }
        }
    }
    int ans = INF;
    for (int i=0;i<n;i++) ans = min(dist[N-1][i], ans);
    if (ans1 == 0) assert(ans == 0);
    return ans;
}

Compilation message (stderr)

railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...