Submission #292512

# Submission time Handle Problem Language Result Execution time Memory
292512 2020-09-07T07:47:43 Z Aldas25 Roller Coaster Railroad (IOI16_railroad) C++14
100 / 100
1251 ms 75176 KB
#include "railroad.h"
#include <bits/stdc++.h>

using namespace std;

#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define REP(n) FOR(O, 1, (n))
#define f first
#define s second
#define pb push_back
typedef vector<int> vi;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<pii> vii;

const int MAXN = 1000100;
const ll INF = 1e16;

int pref[MAXN];
int par[MAXN];
ll balance[MAXN];
int find (int a) {return par[a] = par[a]==a ? a : find(par[a]);}
bool same (int a, int b) {return find(a) == find(b);}
void unite (int a, int b) {
    a = find(a), b = find(b);
    if (a == b) return;
    par[b] = a;
}

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

    s.pb((int)1000 * 1000 * 1000);
    t.pb(1);

    set<int> cur;
    map<int, int> toId, toCoords;
    FOR(i, 0, n) cur.insert(s[i]);
    FOR(i, 0, n) cur.insert(t[i]);

    int curId = 0;
    for (int x : cur) {
        toId[x] = ++curId;
        toCoords[curId] = x;
    }

    FOR(i, 0, curId+5) par[i] = i;

    FOR(i, 0, n) s[i] = toId[s[i]];
    FOR(i, 0, n) t[i] = toId[t[i]];

    //FOR(i, 0, n) cout << " i = " << i << " s[i] = " << s[i] << "  t[i] = " << t[i] << endl;

    FOR(i, 0, n) pref[s[i]]++, pref[t[i]]--;
   // FOR(i, 1, curId) cout <<"  i = "  << i<< " pref: " << pref[i] << endl;

    int ss = 0;
    FOR(i, 1, curId-1) {
        ss += pref[i];
        balance[i] = ss;
       // cout << " i = " << i << "  balance: " << balance[i] << endl;
    }

    FOR(i, 0, n) unite(s[i], t[i]);
    ll sum = 0ll;
    FOR(i, 1, curId-1) {
        if (balance[i] > 0) {
            unite(i, i+1);
            sum += balance[i] * (toCoords[i+1] - toCoords[i]);
        }
        if (balance[i] < 0) unite(i, i+1);
    }

    vector<pair<ll, pii>> edges;

    FOR(i, 1, curId-1) {
        if (!same(i, i+1)) {
            edges.pb({(toCoords[i+1] - toCoords[i]), {i, i+1}});
        }
    }

    sort(edges.begin(), edges.end());
    for (auto e : edges) {
        ll w = e.f;
        int u = e.s.f, v = e.s.s;
        if (!same (u,v)) {
            sum += w;
            unite(u,v);
        }
    }

    return sum;

}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB n = 2
2 Correct 0 ms 384 KB n = 2
3 Correct 0 ms 384 KB n = 2
4 Correct 0 ms 384 KB n = 2
5 Correct 0 ms 384 KB n = 2
6 Correct 0 ms 384 KB n = 2
7 Correct 0 ms 384 KB n = 3
8 Correct 1 ms 384 KB n = 3
9 Correct 1 ms 384 KB n = 3
10 Correct 0 ms 384 KB n = 8
11 Correct 1 ms 384 KB n = 8
12 Correct 0 ms 384 KB n = 8
13 Correct 1 ms 384 KB n = 8
14 Correct 1 ms 384 KB n = 8
15 Correct 0 ms 384 KB n = 8
16 Correct 0 ms 384 KB n = 8
17 Correct 0 ms 384 KB n = 8
18 Correct 1 ms 384 KB n = 8
19 Correct 0 ms 384 KB n = 3
20 Correct 1 ms 384 KB n = 7
21 Correct 0 ms 384 KB n = 8
22 Correct 1 ms 384 KB n = 8
23 Correct 0 ms 384 KB n = 8
24 Correct 1 ms 384 KB n = 8
25 Correct 0 ms 384 KB n = 8
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB n = 2
2 Correct 0 ms 384 KB n = 2
3 Correct 0 ms 384 KB n = 2
4 Correct 0 ms 384 KB n = 2
5 Correct 0 ms 384 KB n = 2
6 Correct 0 ms 384 KB n = 2
7 Correct 0 ms 384 KB n = 3
8 Correct 1 ms 384 KB n = 3
9 Correct 1 ms 384 KB n = 3
10 Correct 0 ms 384 KB n = 8
11 Correct 1 ms 384 KB n = 8
12 Correct 0 ms 384 KB n = 8
13 Correct 1 ms 384 KB n = 8
14 Correct 1 ms 384 KB n = 8
15 Correct 0 ms 384 KB n = 8
16 Correct 0 ms 384 KB n = 8
17 Correct 0 ms 384 KB n = 8
18 Correct 1 ms 384 KB n = 8
19 Correct 0 ms 384 KB n = 3
20 Correct 1 ms 384 KB n = 7
21 Correct 0 ms 384 KB n = 8
22 Correct 1 ms 384 KB n = 8
23 Correct 0 ms 384 KB n = 8
24 Correct 1 ms 384 KB n = 8
25 Correct 0 ms 384 KB n = 8
26 Correct 1 ms 384 KB n = 8
27 Correct 0 ms 384 KB n = 8
28 Correct 1 ms 384 KB n = 8
29 Correct 0 ms 384 KB n = 16
30 Correct 0 ms 384 KB n = 16
31 Correct 1 ms 384 KB n = 16
32 Correct 0 ms 384 KB n = 16
33 Correct 0 ms 384 KB n = 16
34 Correct 0 ms 384 KB n = 16
35 Correct 0 ms 384 KB n = 16
36 Correct 0 ms 384 KB n = 15
37 Correct 0 ms 384 KB n = 8
38 Correct 0 ms 384 KB n = 16
39 Correct 0 ms 384 KB n = 16
40 Correct 0 ms 384 KB n = 9
41 Correct 0 ms 384 KB n = 16
42 Correct 0 ms 384 KB n = 16
43 Correct 0 ms 384 KB n = 16
44 Correct 0 ms 384 KB n = 9
45 Correct 1 ms 384 KB n = 15
46 Correct 0 ms 384 KB n = 16
47 Correct 0 ms 384 KB n = 16
48 Correct 0 ms 384 KB n = 16
# Verdict Execution time Memory Grader output
1 Correct 1120 ms 66196 KB n = 199999
2 Correct 1246 ms 66140 KB n = 199991
3 Correct 1229 ms 66264 KB n = 199993
4 Correct 801 ms 50388 KB n = 152076
5 Correct 436 ms 31068 KB n = 93249
6 Correct 1026 ms 54744 KB n = 199910
7 Correct 1107 ms 64728 KB n = 199999
8 Correct 1027 ms 55292 KB n = 199997
9 Correct 950 ms 56572 KB n = 171294
10 Correct 718 ms 46760 KB n = 140872
11 Correct 1042 ms 55640 KB n = 199886
12 Correct 1179 ms 65368 KB n = 199996
13 Correct 1042 ms 57944 KB n = 200000
14 Correct 1167 ms 67132 KB n = 199998
15 Correct 1161 ms 66204 KB n = 200000
16 Correct 1208 ms 68184 KB n = 199998
17 Correct 1016 ms 66264 KB n = 200000
18 Correct 1145 ms 63016 KB n = 190000
19 Correct 792 ms 58760 KB n = 177777
20 Correct 461 ms 33256 KB n = 100000
21 Correct 1147 ms 66180 KB n = 200000
22 Correct 1251 ms 71316 KB n = 200000
23 Correct 1162 ms 66392 KB n = 200000
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB n = 2
2 Correct 0 ms 384 KB n = 2
3 Correct 0 ms 384 KB n = 2
4 Correct 0 ms 384 KB n = 2
5 Correct 0 ms 384 KB n = 2
6 Correct 0 ms 384 KB n = 2
7 Correct 0 ms 384 KB n = 3
8 Correct 1 ms 384 KB n = 3
9 Correct 1 ms 384 KB n = 3
10 Correct 0 ms 384 KB n = 8
11 Correct 1 ms 384 KB n = 8
12 Correct 0 ms 384 KB n = 8
13 Correct 1 ms 384 KB n = 8
14 Correct 1 ms 384 KB n = 8
15 Correct 0 ms 384 KB n = 8
16 Correct 0 ms 384 KB n = 8
17 Correct 0 ms 384 KB n = 8
18 Correct 1 ms 384 KB n = 8
19 Correct 0 ms 384 KB n = 3
20 Correct 1 ms 384 KB n = 7
21 Correct 0 ms 384 KB n = 8
22 Correct 1 ms 384 KB n = 8
23 Correct 0 ms 384 KB n = 8
24 Correct 1 ms 384 KB n = 8
25 Correct 0 ms 384 KB n = 8
26 Correct 1 ms 384 KB n = 8
27 Correct 0 ms 384 KB n = 8
28 Correct 1 ms 384 KB n = 8
29 Correct 0 ms 384 KB n = 16
30 Correct 0 ms 384 KB n = 16
31 Correct 1 ms 384 KB n = 16
32 Correct 0 ms 384 KB n = 16
33 Correct 0 ms 384 KB n = 16
34 Correct 0 ms 384 KB n = 16
35 Correct 0 ms 384 KB n = 16
36 Correct 0 ms 384 KB n = 15
37 Correct 0 ms 384 KB n = 8
38 Correct 0 ms 384 KB n = 16
39 Correct 0 ms 384 KB n = 16
40 Correct 0 ms 384 KB n = 9
41 Correct 0 ms 384 KB n = 16
42 Correct 0 ms 384 KB n = 16
43 Correct 0 ms 384 KB n = 16
44 Correct 0 ms 384 KB n = 9
45 Correct 1 ms 384 KB n = 15
46 Correct 0 ms 384 KB n = 16
47 Correct 0 ms 384 KB n = 16
48 Correct 0 ms 384 KB n = 16
49 Correct 1120 ms 66196 KB n = 199999
50 Correct 1246 ms 66140 KB n = 199991
51 Correct 1229 ms 66264 KB n = 199993
52 Correct 801 ms 50388 KB n = 152076
53 Correct 436 ms 31068 KB n = 93249
54 Correct 1026 ms 54744 KB n = 199910
55 Correct 1107 ms 64728 KB n = 199999
56 Correct 1027 ms 55292 KB n = 199997
57 Correct 950 ms 56572 KB n = 171294
58 Correct 718 ms 46760 KB n = 140872
59 Correct 1042 ms 55640 KB n = 199886
60 Correct 1179 ms 65368 KB n = 199996
61 Correct 1042 ms 57944 KB n = 200000
62 Correct 1167 ms 67132 KB n = 199998
63 Correct 1161 ms 66204 KB n = 200000
64 Correct 1208 ms 68184 KB n = 199998
65 Correct 1016 ms 66264 KB n = 200000
66 Correct 1145 ms 63016 KB n = 190000
67 Correct 792 ms 58760 KB n = 177777
68 Correct 461 ms 33256 KB n = 100000
69 Correct 1147 ms 66180 KB n = 200000
70 Correct 1251 ms 71316 KB n = 200000
71 Correct 1162 ms 66392 KB n = 200000
72 Correct 1116 ms 66136 KB n = 200000
73 Correct 1222 ms 66136 KB n = 200000
74 Correct 1239 ms 70104 KB n = 200000
75 Correct 1051 ms 70104 KB n = 200000
76 Correct 972 ms 69976 KB n = 200000
77 Correct 760 ms 38776 KB n = 200000
78 Correct 839 ms 43860 KB n = 200000
79 Correct 1046 ms 64216 KB n = 184307
80 Correct 305 ms 26788 KB n = 76040
81 Correct 1042 ms 58456 KB n = 199981
82 Correct 1144 ms 68440 KB n = 199994
83 Correct 1070 ms 60592 KB n = 199996
84 Correct 1167 ms 70232 KB n = 199998
85 Correct 1183 ms 69080 KB n = 200000
86 Correct 1200 ms 71580 KB n = 199998
87 Correct 1012 ms 69976 KB n = 200000
88 Correct 1237 ms 70124 KB n = 200000
89 Correct 920 ms 70104 KB n = 200000
90 Correct 1146 ms 70104 KB n = 200000
91 Correct 1228 ms 75176 KB n = 200000
92 Correct 1131 ms 69972 KB n = 200000