제출 #1152892

#제출 시각아이디문제언어결과실행 시간메모리
1152892alexddRoller Coaster Railroad (IOI16_railroad)C++20
64 / 100
223 ms23192 KiB
#include "railroad.h"
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n;
vector<int> s,t;
int brut()
{
    vector<vector<int>> dp((1<<n),vector<int>(n,INF));
    for(int i=0;i<n;i++)
        dp[(1<<i)][i]=0;
    for(int config=1;config<(1<<n);config++)
    {
        if(config == (config&(-config)))
            continue;
        for(int ult=0;ult<n;ult++)
        {
            if(!((1<<ult)&config))
                continue;
            for(int p=0;p<n;p++)
            {
                if(p==ult || !((1<<p)&config))
                    continue;
                dp[config][ult] = min(dp[config][ult], dp[config-(1<<ult)][p] + max(0LL, t[p] - s[ult]));
            }
        }
    }
    int mnm=INF;
    for(int i=0;i<n;i++)
        mnm = min(mnm, dp[(1<<n)-1][i]);
    return mnm;
}
int isvalid()
{
    vector<pair<int,int>> v;
    for(int i=0;i<n;i++)
        v.push_back({t[i],s[i]});
    sort(v.begin(),v.end());
    reverse(v.begin(),v.end());
    set<pair<int,int>> libere;
    for(int i=0;i<n;i++)
        libere.insert({v[i].second, i});
    for(int i=1;i<n;i++)
    {
        auto it = libere.lower_bound({v[i].first, -1});
        if(it!=libere.end() && (*it).second==i)
            it++;
        if(it==libere.end())
            return 0;
        libere.erase(it);
    }
    return 1;
}
long long plan_roller_coaster(std::vector<int32_t> cit_s, std::vector<int32_t> cit_t)
{
    n = cit_s.size();
    s.resize(n);
    t.resize(n);
    for(int i=0;i<n;i++)
    {
        s[i] = cit_s[i];
        t[i] = cit_t[i];
    }
    if(n<=16) return brut();
    if(isvalid()) return 0;

    vector<pair<int,int>> v;
    for(int i=0;i<n;i++)
        v.push_back({t[i],s[i]});
    sort(v.begin(),v.end());
    reverse(v.begin(),v.end());
    set<pair<int,int>> libere;
    for(int i=0;i<n;i++)
        libere.insert({v[i].second, i});
    int sum=0,cnt=0;
    for(int i=1;i<n;i++)
    {
        auto it = libere.lower_bound({v[i].first, -1});
        if(it!=libere.end() && (*it).second==i)
            it++;
        if(it==libere.end())
        {
            sum += v[i].first;
            cnt++;
        }
        else
            libere.erase(it);
    }
    for(int i=0;i<cnt;i++)
    {
        sum -= (*prev(libere.end())).first;
        libere.erase(prev(libere.end()));
    }
    return sum;
}
/*

4
1 7
4 3
5 8
6 6

output: 3



*/

컴파일 시 표준 에러 (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...