Submission #1208777

#TimeUsernameProblemLanguageResultExecution timeMemory
1208777QuentolosseRoller Coaster Railroad (IOI16_railroad)C++20
34 / 100
620 ms167752 KiB
#include "railroad.h"

#include <bits/stdc++.h>

#define int long long

using namespace std;

int lent(vector<signed> s, vector<signed> t) {

    int n = (int) s.size();
    
    int a = 1 << n;
    
    vector<vector<vector<int>>> dp(n+2, vector<vector<int>> (n+1, vector<int>(a+1, 1e18)));
    
    dp[0][n][0] = 0;
    t.push_back(1);

    for (int pos = 0; pos < n; pos++)
    {
        for (int avant = 0; avant <= n; avant++)
        {
            for (int mask = 0; mask < a; mask++)
            {
                if (!((mask >> avant) & 1) && avant != n) continue;
                for (int prochain = 0; prochain < n; prochain++)
                {
                    if ((mask >> prochain) & 1) continue;
                    int new_mask = mask | (1 << prochain);

                    dp[pos+1][prochain][new_mask] = min(dp[pos+1][prochain][new_mask], dp[pos][avant][mask] + max(t[avant] - s[prochain], 0));
                }
            }
        }
    }
    
    int reponse = 1e18;
    for (int i = 0; i < n; i++)
    {
        reponse = min(reponse, dp[n][i][a-1]);
    }
    
    return reponse;

}

long long plan_roller_coaster(std::vector<signed> s, std::vector<signed> t) {
    int n = (int) s.size();
    
    if (n <= 16) return lent(s, t);

    int avant = 1;
    int fin = 1e18;

    t.push_back(1);

    set<pair<int,int>> rails;
    for (int i = 0; i < n; i++)
    {
        rails.insert(make_pair(s[i], i));
    }

    vector<int> au_debut;
    au_debut.push_back(n);

    for (int i = 0; i < n; i++)
    {
        auto it = rails.lower_bound(make_pair(avant, -1));
        while (it == rails.end()) {
            
            int r = au_debut.back();

            if (t[r] > fin) {
                return 42;
            }

            fin = s[r];
            au_debut.pop_back();
            avant = t[au_debut.back()];

            it = rails.lower_bound(make_pair(avant, -1));
        }

        int r = it->second;
        
        rails.erase(it);
        au_debut.push_back(r);
        avant = t[r];
    }
    if (avant > fin) return 42;

    return 0;
}

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...