답안 #67053

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
67053 2018-08-13T09:24:51 Z Inovak Roller Coaster Railroad (IOI16_railroad) C++14
34 / 100
327 ms 21156 KB
#include "railroad.h"
#include <bits/stdc++.h>

#define fr first
#define sc second
#define ll long long
#define mk make_pair
#define pb push_back
#define sz(s) s.size()
#define all(s) s.begin(), s.end()

using namespace std;

const int N = 2e5+10;
const ll inf = 1e16+7;

struct node {
    int a, b, c;
};

node a[N], c[N];
int b[N], d[N], lb[N];
int t[N*4];

bool cmp(node a, node b) {
    if(lb[a.c] > lb[b.c]) return 1;
    if(lb[a.c] == lb[b.c] && a.a < b.a) return 1;
    return 0;
}

bool cmp2(node a, node b) {
    return (a.a < b.a);
}

void build(int v, int tl, int tr) {
    if(tl == tr) {
        t[v] = c[tl].c;
    }
    else {
        int tm = (tl + tr) / 2;
        build(v + v, tl, tm);
        build(v + v + 1, tm + 1, tr);
        t[v] = t[v + v];
        if(b[t[v]] > b[t[v + v + 1]])
            t[v] = t[v + v + 1];
    }
}

void update(int v, int tl, int tr, int pos) {
    if(tl = tr) {
        t[v] = 0;
    }
    else {
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            update(v + v, tl, tm, pos);
        else
            update(v + v + 1, tm + 1, tr, pos);
        t[v] = t[v + v];
        if(b[t[v]] > b[t[v + v + 1]])
            t[v] = t[v + v + 1];
    }
}

int get(int v, int tl, int tr, int l, int r) {
    if(tl > r || tr < l || tr < tl || l > r) return 0;
    if(tl >= l && r >= tr) {
        return t[v];
    }
    int tm = (tl + tr) / 2;
    int in = get(v + v, tl, tm, l, r);
    int id = get(v + v + 1, tm + 1, tr, l, r);
    if(b[in] < b[id]) return in;
    return id;
}

ll dp[70000][20];

long long plan_roller_coaster(vector<int> s, vector<int> t) {
    int n = (int) s.size();
    b[0] = n+10;
    if(n <= 16) {
        memset(dp, inf, sizeof(dp));
        for(int i = 1; i < (1 << n); i++) {
            if(__builtin_popcount(i) == 1) {
                for(int j = 0; j < n; j++) {
                    if(i & (1 << j)) {
                        dp[i][j] = 0;
                    }
                }
                continue;
            }
            for(int j = 0; j < n; j++) {
                for(int k = 0; k < n; k++) {
                    if(j != k) {
                        if((i & (1 << j)) && (i & (1 << k))) {
                            ll o = max(0, t[k] - s[j]);
                            dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + o);
                        }
                    }
                }
            }
        }
        ll ans = inf;
        for(int i = 0; i < n; i++) {
            ans = min(ans, dp[(1 << n) - 1][i]);
        }
        return ans;
    }
    for(int i = 0; i < n; i++) {
        a[i+1].a = s[i];
        a[i+1].b = t[i];
        a[i+1].c = i+1;
        c[i+1] = a[i+1];
    }
    sort(c + 1, c + n + 1, &cmp2);
    for(int i = 1; i <= n; i++) {
        int l = 0, r = n + 1;
        while(r - l > 1) {
            int m = (l + r) / 2;
            if(c[m].a >= a[i].b) r = m;
            else l = m;
        }
        lb[a[i].c] = r;
    }
    sort(a + 1, a + n + 1, &cmp);
    for(int i = 1; i <= n; i++)
        b[a[i].c] = d[c[i].c] = i;

    build(1, 1, n);
    int cnt = 1, in = 1;
    while(cnt < n) {
        update(1, 1, n, d[a[in].c]);
        int l = 0, r = n + 1;
        while(r - l > 1) {
            int m = (l + r) / 2;
            if(c[m].a >= a[in].b) r = m;
            else l = m;
        }
        int o = get(1, 1, n, r, n);
        if(o == 0) break;
        update(1, 1, n, o);
        cnt++;
        in = o;
    }
    if(cnt == n) return 0;
    return 1;
}
//
//int main() {
//    int n;
//    cin >> n;
//    vector <int> s, t;
//    for(int i = 0, x; i < n; i++) {
//        cin >> x;
//        s.pb(x);
//        cin >> x;
//        t.pb(x);
//    }
//    cout << plan_roller_coaster(s, t) << endl;
//}
//

Compilation message

railroad.cpp: In function 'void update(int, int, int, int)':
railroad.cpp:50:11: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(tl = tr) {
        ~~~^~~~
railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:83:35: warning: overflow in implicit constant conversion [-Woverflow]
         memset(dp, inf, sizeof(dp));
                                   ^
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 11384 KB n = 2
2 Correct 11 ms 11488 KB n = 2
3 Correct 12 ms 11488 KB n = 2
4 Correct 11 ms 11532 KB n = 2
5 Correct 11 ms 11532 KB n = 2
6 Correct 13 ms 11532 KB n = 2
7 Correct 11 ms 11592 KB n = 3
8 Correct 14 ms 11592 KB n = 3
9 Correct 13 ms 11592 KB n = 3
10 Correct 12 ms 11652 KB n = 8
11 Correct 13 ms 11652 KB n = 8
12 Correct 12 ms 11744 KB n = 8
13 Correct 14 ms 11744 KB n = 8
14 Correct 12 ms 11744 KB n = 8
15 Correct 12 ms 11744 KB n = 8
16 Correct 12 ms 11744 KB n = 8
17 Correct 12 ms 11744 KB n = 8
18 Correct 13 ms 11744 KB n = 8
19 Correct 12 ms 11744 KB n = 3
20 Correct 12 ms 11744 KB n = 7
21 Correct 13 ms 11744 KB n = 8
22 Correct 13 ms 11744 KB n = 8
23 Correct 12 ms 11832 KB n = 8
24 Correct 13 ms 11832 KB n = 8
25 Correct 11 ms 11832 KB n = 8
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 11384 KB n = 2
2 Correct 11 ms 11488 KB n = 2
3 Correct 12 ms 11488 KB n = 2
4 Correct 11 ms 11532 KB n = 2
5 Correct 11 ms 11532 KB n = 2
6 Correct 13 ms 11532 KB n = 2
7 Correct 11 ms 11592 KB n = 3
8 Correct 14 ms 11592 KB n = 3
9 Correct 13 ms 11592 KB n = 3
10 Correct 12 ms 11652 KB n = 8
11 Correct 13 ms 11652 KB n = 8
12 Correct 12 ms 11744 KB n = 8
13 Correct 14 ms 11744 KB n = 8
14 Correct 12 ms 11744 KB n = 8
15 Correct 12 ms 11744 KB n = 8
16 Correct 12 ms 11744 KB n = 8
17 Correct 12 ms 11744 KB n = 8
18 Correct 13 ms 11744 KB n = 8
19 Correct 12 ms 11744 KB n = 3
20 Correct 12 ms 11744 KB n = 7
21 Correct 13 ms 11744 KB n = 8
22 Correct 13 ms 11744 KB n = 8
23 Correct 12 ms 11832 KB n = 8
24 Correct 13 ms 11832 KB n = 8
25 Correct 11 ms 11832 KB n = 8
26 Correct 14 ms 11832 KB n = 8
27 Correct 11 ms 11832 KB n = 8
28 Correct 12 ms 11832 KB n = 8
29 Correct 77 ms 11892 KB n = 16
30 Correct 87 ms 11892 KB n = 16
31 Correct 76 ms 11892 KB n = 16
32 Correct 83 ms 11892 KB n = 16
33 Correct 97 ms 11892 KB n = 16
34 Correct 85 ms 11892 KB n = 16
35 Correct 82 ms 11896 KB n = 16
36 Correct 41 ms 11896 KB n = 15
37 Correct 12 ms 11896 KB n = 8
38 Correct 92 ms 11948 KB n = 16
39 Correct 84 ms 11948 KB n = 16
40 Correct 13 ms 11948 KB n = 9
41 Correct 86 ms 11948 KB n = 16
42 Correct 92 ms 11948 KB n = 16
43 Correct 89 ms 12004 KB n = 16
44 Correct 13 ms 12004 KB n = 9
45 Correct 47 ms 12004 KB n = 15
46 Correct 86 ms 12004 KB n = 16
47 Correct 85 ms 12020 KB n = 16
48 Correct 83 ms 12020 KB n = 16
# 결과 실행 시간 메모리 Grader output
1 Correct 296 ms 17208 KB n = 199999
2 Incorrect 327 ms 21156 KB answer is not correct: 0 instead of 1
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 11384 KB n = 2
2 Correct 11 ms 11488 KB n = 2
3 Correct 12 ms 11488 KB n = 2
4 Correct 11 ms 11532 KB n = 2
5 Correct 11 ms 11532 KB n = 2
6 Correct 13 ms 11532 KB n = 2
7 Correct 11 ms 11592 KB n = 3
8 Correct 14 ms 11592 KB n = 3
9 Correct 13 ms 11592 KB n = 3
10 Correct 12 ms 11652 KB n = 8
11 Correct 13 ms 11652 KB n = 8
12 Correct 12 ms 11744 KB n = 8
13 Correct 14 ms 11744 KB n = 8
14 Correct 12 ms 11744 KB n = 8
15 Correct 12 ms 11744 KB n = 8
16 Correct 12 ms 11744 KB n = 8
17 Correct 12 ms 11744 KB n = 8
18 Correct 13 ms 11744 KB n = 8
19 Correct 12 ms 11744 KB n = 3
20 Correct 12 ms 11744 KB n = 7
21 Correct 13 ms 11744 KB n = 8
22 Correct 13 ms 11744 KB n = 8
23 Correct 12 ms 11832 KB n = 8
24 Correct 13 ms 11832 KB n = 8
25 Correct 11 ms 11832 KB n = 8
26 Correct 14 ms 11832 KB n = 8
27 Correct 11 ms 11832 KB n = 8
28 Correct 12 ms 11832 KB n = 8
29 Correct 77 ms 11892 KB n = 16
30 Correct 87 ms 11892 KB n = 16
31 Correct 76 ms 11892 KB n = 16
32 Correct 83 ms 11892 KB n = 16
33 Correct 97 ms 11892 KB n = 16
34 Correct 85 ms 11892 KB n = 16
35 Correct 82 ms 11896 KB n = 16
36 Correct 41 ms 11896 KB n = 15
37 Correct 12 ms 11896 KB n = 8
38 Correct 92 ms 11948 KB n = 16
39 Correct 84 ms 11948 KB n = 16
40 Correct 13 ms 11948 KB n = 9
41 Correct 86 ms 11948 KB n = 16
42 Correct 92 ms 11948 KB n = 16
43 Correct 89 ms 12004 KB n = 16
44 Correct 13 ms 12004 KB n = 9
45 Correct 47 ms 12004 KB n = 15
46 Correct 86 ms 12004 KB n = 16
47 Correct 85 ms 12020 KB n = 16
48 Correct 83 ms 12020 KB n = 16
49 Correct 296 ms 17208 KB n = 199999
50 Incorrect 327 ms 21156 KB answer is not correct: 0 instead of 1
51 Halted 0 ms 0 KB -