Submission #54322

#TimeUsernameProblemLanguageResultExecution timeMemory
54322Alexa2001Roller Coaster Railroad (IOI16_railroad)C++17
100 / 100
1419 ms181952 KiB
#include "railroad.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> Pair;
const int Nmax = 4e5 + 5, lim = 1e9;

int n, len[Nmax], t[Nmax], comp[Nmax], balance[Nmax];
map<int, int> mp;
vector<int> v[Nmax];
vector< pair<int, Pair> > edge;

void dfs(int node, int c)
{
    comp[node] = c;
    for(auto it : v[node])
        if(!comp[it]) dfs(it, c);
}

void add_edge_for_apm(int x, int y, int cost)
{
    edge.push_back({ cost, {x, y} });
}

void add_edge(int x, int y)
{
    v[x].push_back(y);
    v[y].push_back(x);
}

int boss(int x)
{
    if(x == t[x]) return x;
    return t[x] = boss(t[x]);
}

void unite(int x, int y)
{
    t[t[x]] = t[y];
}

void APM(ll &ans, int n)
{
    int i;
    for(i=1; i<=n; ++i) t[i] = i;

    sort(edge.begin(), edge.end());
    int x, y, cost;
    for(auto it : edge)
    {
        x = it.second.first;
        y = it.second.second;
        cost = it.first;

        if(boss(x) == boss(y)) continue;
        ans += cost;
        unite(x, y);
    }
}

ll plan_roller_coaster(vector<int> s, vector<int> t)
{
    s.push_back(lim);
    t.push_back(1);

    for(auto it : s) mp[it] ++;
    for(auto it : t) mp[it] --;

    int n = 0, sum = 0, prv = 0;
    for(auto &it : mp)
    {
        sum += it.second;
        len[n] = it.first - prv;
        balance[++n] = sum;

        it.second = n;
        prv = it.first;
    }

    ll ans = 0;
    int i;

    for(i=1; i<n; ++i)
        if(balance[i])
        {
            ans += (ll) len[i] * max(0, balance[i]);
            add_edge(i, i+1);
        }

    for(i=0; i<s.size(); ++i)
        add_edge(mp[s[i]], mp[t[i]]);

    int Comp = 0;
    for(i=1; i<=n; ++i)
        if(!comp[i])
            dfs(i, ++Comp);

    for(i=1; i<n; ++i)
        add_edge_for_apm(comp[i], comp[i+1], len[i]);

    APM(ans, Comp);
    return ans;
}

Compilation message (stderr)

railroad.cpp: In function 'll plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:92:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<s.size(); ++i)
              ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...