Submission #223610

# Submission time Handle Problem Language Result Execution time Memory
223610 2020-04-15T17:35:44 Z DavidDamian Roller Coaster Railroad (IOI16_railroad) C++11
100 / 100
203 ms 26076 KB
#include "railroad.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
///Disjoint Sets
///Sweep Line
///Set the balance always to 0, connecting special sections
int link[200005];
int setSize[200005];
int Find(int u)
{
    if(link[u]==u) return u;
    else return link[u]=Find(link[u]);
}
bool same(int u,int v)
{
    return Find(u)==Find(v);
}
void unite(int u,int v)
{
    u=Find(u);
    v=Find(v);
    if(u==v) return;
    if(setSize[v]>setSize[u]) swap(u,v);
    setSize[u]+=setSize[v];
    link[v]=u;
}
void initDSU(int n)
{
    for(int i=1;i<=n;i++){
        setSize[i]=1;
        link[i]=i;
    }
}
struct event
{
    int T;
    int op;
    int id; //Which special section
    bool operator<(const event& a)
    {
        if(T<a.T) return true;
        else{
            if(T==a.T){
                if(op<a.op) return true;
                else return false;
            }
            else return false;
        }
    }
};
struct segment
{
    ll length;
    int a,b; //ID where it starts and ends
    bool operator<(const segment& s)
    {
        return length<s.length;
    }
};
vector<event> timeline;
vector<segment> remaining; //Not taken because its balance was 0
long long plan_roller_coaster(vector<int> s, vector<int> t) {
    int n=s.size();
    ll cost=0;
    initDSU(n);
    for(int i=0;i<n;i++){
        event e={s[i],+1,i+1};
        timeline.push_back(e);
        e={t[i],-1,i+1};
        timeline.push_back(e);
    }
    sort(timeline.begin(),timeline.end());
    //Lines to the right are +1
    //Lines to the left are -1
    ll balance=-1; //Because there is a line that goes from inf to 1
    for(int i=0;i<2*n-1;i++){
        balance+=timeline[i].op;
        if(balance<0){
            unite(timeline[i].id,timeline[i+1].id); //Add a track from left to right (free) and connect i with i+1
        }
        else if(balance>0){
            cost+=(ll)(timeline[i+1].T-timeline[i].T)*balance; //We need to slow down the train so we add "balance" tracks
            //With length: distance between that two events
            unite(timeline[i].id,timeline[i+1].id);
        }
        else if(balance==0){
            segment s;
            s.length=(timeline[i+1].T-timeline[i].T);
            s.a=timeline[i].id;
            s.b=timeline[i+1].id;
            remaining.push_back(s);
        }
    }
    sort(remaining.begin(),remaining.end());
    set<int> R; //Roots
    for(int i=1;i<=n;i++){
        R.insert(Find(i));
    }
    int roots=R.size();
    int i=0;
    while(roots>1){ //Not fully connected
        int a=remaining[i].a;
        int b=remaining[i].b;
        if(!same(a,b)){
            unite(a,b);
            cost+=remaining[i].length;
            roots--;
        }
        i++;
    }
    return cost;
}
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB n = 2
2 Correct 4 ms 384 KB n = 2
3 Correct 4 ms 384 KB n = 2
4 Correct 5 ms 384 KB n = 2
5 Correct 5 ms 384 KB n = 2
6 Correct 5 ms 384 KB n = 2
7 Correct 5 ms 384 KB n = 3
8 Correct 5 ms 384 KB n = 3
9 Correct 5 ms 384 KB n = 3
10 Correct 5 ms 384 KB n = 8
11 Correct 5 ms 256 KB n = 8
12 Correct 5 ms 256 KB n = 8
13 Correct 4 ms 384 KB n = 8
14 Correct 4 ms 256 KB n = 8
15 Correct 5 ms 384 KB n = 8
16 Correct 4 ms 384 KB n = 8
17 Correct 5 ms 384 KB n = 8
18 Correct 5 ms 256 KB n = 8
19 Correct 5 ms 384 KB n = 3
20 Correct 5 ms 384 KB n = 7
21 Correct 5 ms 384 KB n = 8
22 Correct 5 ms 384 KB n = 8
23 Correct 5 ms 384 KB n = 8
24 Correct 5 ms 128 KB n = 8
25 Correct 5 ms 384 KB n = 8
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB n = 2
2 Correct 4 ms 384 KB n = 2
3 Correct 4 ms 384 KB n = 2
4 Correct 5 ms 384 KB n = 2
5 Correct 5 ms 384 KB n = 2
6 Correct 5 ms 384 KB n = 2
7 Correct 5 ms 384 KB n = 3
8 Correct 5 ms 384 KB n = 3
9 Correct 5 ms 384 KB n = 3
10 Correct 5 ms 384 KB n = 8
11 Correct 5 ms 256 KB n = 8
12 Correct 5 ms 256 KB n = 8
13 Correct 4 ms 384 KB n = 8
14 Correct 4 ms 256 KB n = 8
15 Correct 5 ms 384 KB n = 8
16 Correct 4 ms 384 KB n = 8
17 Correct 5 ms 384 KB n = 8
18 Correct 5 ms 256 KB n = 8
19 Correct 5 ms 384 KB n = 3
20 Correct 5 ms 384 KB n = 7
21 Correct 5 ms 384 KB n = 8
22 Correct 5 ms 384 KB n = 8
23 Correct 5 ms 384 KB n = 8
24 Correct 5 ms 128 KB n = 8
25 Correct 5 ms 384 KB n = 8
26 Correct 5 ms 384 KB n = 8
27 Correct 5 ms 384 KB n = 8
28 Correct 5 ms 384 KB n = 8
29 Correct 5 ms 384 KB n = 16
30 Correct 4 ms 384 KB n = 16
31 Correct 5 ms 384 KB n = 16
32 Correct 5 ms 384 KB n = 16
33 Correct 4 ms 384 KB n = 16
34 Correct 5 ms 384 KB n = 16
35 Correct 5 ms 256 KB n = 16
36 Correct 5 ms 384 KB n = 15
37 Correct 5 ms 384 KB n = 8
38 Correct 4 ms 384 KB n = 16
39 Correct 4 ms 384 KB n = 16
40 Correct 5 ms 384 KB n = 9
41 Correct 5 ms 384 KB n = 16
42 Correct 4 ms 256 KB n = 16
43 Correct 5 ms 384 KB n = 16
44 Correct 4 ms 384 KB n = 9
45 Correct 4 ms 384 KB n = 15
46 Correct 4 ms 384 KB n = 16
47 Correct 5 ms 256 KB n = 16
48 Correct 5 ms 256 KB n = 16
# Verdict Execution time Memory Grader output
1 Correct 138 ms 15208 KB n = 199999
2 Correct 131 ms 15208 KB n = 199991
3 Correct 137 ms 15340 KB n = 199993
4 Correct 98 ms 12776 KB n = 152076
5 Correct 64 ms 7532 KB n = 93249
6 Correct 116 ms 14056 KB n = 199910
7 Correct 123 ms 14444 KB n = 199999
8 Correct 116 ms 14056 KB n = 199997
9 Correct 114 ms 13800 KB n = 171294
10 Correct 94 ms 12648 KB n = 140872
11 Correct 119 ms 14056 KB n = 199886
12 Correct 136 ms 14696 KB n = 199996
13 Correct 123 ms 14188 KB n = 200000
14 Correct 140 ms 19040 KB n = 199998
15 Correct 140 ms 19168 KB n = 200000
16 Correct 153 ms 19560 KB n = 199998
17 Correct 131 ms 15340 KB n = 200000
18 Correct 127 ms 14824 KB n = 190000
19 Correct 116 ms 14184 KB n = 177777
20 Correct 66 ms 7792 KB n = 100000
21 Correct 131 ms 15208 KB n = 200000
22 Correct 201 ms 22624 KB n = 200000
23 Correct 155 ms 20828 KB n = 200000
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB n = 2
2 Correct 4 ms 384 KB n = 2
3 Correct 4 ms 384 KB n = 2
4 Correct 5 ms 384 KB n = 2
5 Correct 5 ms 384 KB n = 2
6 Correct 5 ms 384 KB n = 2
7 Correct 5 ms 384 KB n = 3
8 Correct 5 ms 384 KB n = 3
9 Correct 5 ms 384 KB n = 3
10 Correct 5 ms 384 KB n = 8
11 Correct 5 ms 256 KB n = 8
12 Correct 5 ms 256 KB n = 8
13 Correct 4 ms 384 KB n = 8
14 Correct 4 ms 256 KB n = 8
15 Correct 5 ms 384 KB n = 8
16 Correct 4 ms 384 KB n = 8
17 Correct 5 ms 384 KB n = 8
18 Correct 5 ms 256 KB n = 8
19 Correct 5 ms 384 KB n = 3
20 Correct 5 ms 384 KB n = 7
21 Correct 5 ms 384 KB n = 8
22 Correct 5 ms 384 KB n = 8
23 Correct 5 ms 384 KB n = 8
24 Correct 5 ms 128 KB n = 8
25 Correct 5 ms 384 KB n = 8
26 Correct 5 ms 384 KB n = 8
27 Correct 5 ms 384 KB n = 8
28 Correct 5 ms 384 KB n = 8
29 Correct 5 ms 384 KB n = 16
30 Correct 4 ms 384 KB n = 16
31 Correct 5 ms 384 KB n = 16
32 Correct 5 ms 384 KB n = 16
33 Correct 4 ms 384 KB n = 16
34 Correct 5 ms 384 KB n = 16
35 Correct 5 ms 256 KB n = 16
36 Correct 5 ms 384 KB n = 15
37 Correct 5 ms 384 KB n = 8
38 Correct 4 ms 384 KB n = 16
39 Correct 4 ms 384 KB n = 16
40 Correct 5 ms 384 KB n = 9
41 Correct 5 ms 384 KB n = 16
42 Correct 4 ms 256 KB n = 16
43 Correct 5 ms 384 KB n = 16
44 Correct 4 ms 384 KB n = 9
45 Correct 4 ms 384 KB n = 15
46 Correct 4 ms 384 KB n = 16
47 Correct 5 ms 256 KB n = 16
48 Correct 5 ms 256 KB n = 16
49 Correct 138 ms 15208 KB n = 199999
50 Correct 131 ms 15208 KB n = 199991
51 Correct 137 ms 15340 KB n = 199993
52 Correct 98 ms 12776 KB n = 152076
53 Correct 64 ms 7532 KB n = 93249
54 Correct 116 ms 14056 KB n = 199910
55 Correct 123 ms 14444 KB n = 199999
56 Correct 116 ms 14056 KB n = 199997
57 Correct 114 ms 13800 KB n = 171294
58 Correct 94 ms 12648 KB n = 140872
59 Correct 119 ms 14056 KB n = 199886
60 Correct 136 ms 14696 KB n = 199996
61 Correct 123 ms 14188 KB n = 200000
62 Correct 140 ms 19040 KB n = 199998
63 Correct 140 ms 19168 KB n = 200000
64 Correct 153 ms 19560 KB n = 199998
65 Correct 131 ms 15340 KB n = 200000
66 Correct 127 ms 14824 KB n = 190000
67 Correct 116 ms 14184 KB n = 177777
68 Correct 66 ms 7792 KB n = 100000
69 Correct 131 ms 15208 KB n = 200000
70 Correct 201 ms 22624 KB n = 200000
71 Correct 155 ms 20828 KB n = 200000
72 Correct 136 ms 15208 KB n = 200000
73 Correct 137 ms 15208 KB n = 200000
74 Correct 135 ms 15208 KB n = 200000
75 Correct 137 ms 15208 KB n = 200000
76 Correct 134 ms 15464 KB n = 200000
77 Correct 127 ms 15208 KB n = 200000
78 Correct 189 ms 26076 KB n = 200000
79 Correct 120 ms 14312 KB n = 184307
80 Correct 53 ms 6892 KB n = 76040
81 Correct 122 ms 14100 KB n = 199981
82 Correct 126 ms 14568 KB n = 199994
83 Correct 121 ms 14220 KB n = 199996
84 Correct 141 ms 19164 KB n = 199998
85 Correct 142 ms 19164 KB n = 200000
86 Correct 151 ms 19576 KB n = 199998
87 Correct 129 ms 15208 KB n = 200000
88 Correct 136 ms 15208 KB n = 200000
89 Correct 134 ms 15208 KB n = 200000
90 Correct 133 ms 15212 KB n = 200000
91 Correct 203 ms 22616 KB n = 200000
92 Correct 157 ms 21100 KB n = 200000