답안 #653598

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
653598 2022-10-27T11:29:41 Z AlperenT Event Hopping (BOI22_events) C++17
10 / 100
1500 ms 52456 KB
#include <bits/stdc++.h>

using namespace std;

#pragma GCC optimize("O3,unroll-loops")

const int N = 1e5 + 5, INF = 1e9 + 5;

int n, q, canmove[N][100 + 5];

struct Event{
    int l, r;

    bool operator < (const Event &sc) const{
        if(r == sc.r) return l < sc.l;
        else return r < sc.r;
    }
};

Event arr[N];

vector<pair<Event, int>> v;

struct SegTree{
    int tree[N * 8];

    SegTree(){
        fill(tree, tree + N * 8, INF);
    }

    void reset(){
        fill(tree, tree + N * 8, INF);
    }

    int merge(int a, int b){
        return min(a, b);
    }

    int query(int l, int r, int v = 1, int tl = 1, int tr = 2 * N - 1){
        if(l > r) return INF;
        else if(l == tl && r == tr) return tree[v];
        else{
            int tm = tl + (tr - tl) / 2;

            return merge(query(l, min(tm, r), v * 2, tl, tm), query(max(tm + 1, l), r, v * 2 + 1, tm + 1, tr));
        }
    }

    void update(int pos, int val, int v = 1, int l = 1, int r = 2 * N - 1){
        if(l == r) tree[v] = min(tree[v], val);
        else{
            int m = l + (r - l) / 2;

            if(pos <= m) update(pos, val, v * 2, l, m);
            else update(pos, val, v * 2 + 1, m + 1, r);

            tree[v] = merge(tree[v * 2], tree[v * 2 + 1]);
        }
    }
};

SegTree sgt;

map<int, int> cmprs;

pair<int, int> query[N];

int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);

    for(int i = 0; i < 105; i++){
        for(int j = 0; j < N; j++){
            canmove[j][i] = INF;
        }
    }

    cin >> n >> q;

    for(int i = 1; i <= n; i++) cin >> arr[i].l >> arr[i].r;

    for(int i = 1; i <= q; i++){
        cin >> query[i].first >> query[i].second;
    }

    for(int i = 1; i <= n; i++) cmprs[arr[i].l] = cmprs[arr[i].r] = 1;

    int tmp = 0;

    for(auto &p : cmprs) p.second = ++tmp;

    for(int i = 1; i <= n; i++) arr[i].l = cmprs[arr[i].l], arr[i].r = cmprs[arr[i].r];

    for(int i = 1; i <= n; i++) v.push_back({arr[i], i});

    sort(v.begin(), v.end());

    for(int i = 1; i <= q; i++){
        for(int j = 1; j <= n; j++){
            if(arr[query[i].first].r == arr[j].r){
                canmove[j][i] = 1;
            }
        }

        canmove[query[i].first][i] = 0;
    }

    for(int i = 1; i <= q; i++){
        sgt.reset();

        for(auto p : v){
            canmove[p.second][i] = min(canmove[p.second][i], sgt.query(p.first.l, p.first.r) + 1);

            sgt.update(p.first.r, canmove[p.second][i]);
        }
    }

    for(int i = 1; i <= q; i++){
        if(canmove[query[i].second][i] == INF) cout << "impossible\n";
        else cout << canmove[query[i].second][i] << "\n"; 
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 44500 KB Output is correct
2 Execution timed out 1594 ms 52436 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 44500 KB Output is correct
2 Correct 21 ms 44628 KB Output is correct
3 Correct 43 ms 44520 KB Output is correct
4 Correct 44 ms 44628 KB Output is correct
5 Correct 45 ms 44620 KB Output is correct
6 Correct 45 ms 44628 KB Output is correct
7 Correct 53 ms 44628 KB Output is correct
8 Correct 50 ms 44668 KB Output is correct
9 Correct 39 ms 44500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 44500 KB Output is correct
2 Correct 21 ms 44628 KB Output is correct
3 Correct 43 ms 44520 KB Output is correct
4 Correct 44 ms 44628 KB Output is correct
5 Correct 45 ms 44620 KB Output is correct
6 Correct 45 ms 44628 KB Output is correct
7 Correct 53 ms 44628 KB Output is correct
8 Correct 50 ms 44668 KB Output is correct
9 Correct 39 ms 44500 KB Output is correct
10 Correct 19 ms 44500 KB Output is correct
11 Correct 20 ms 44496 KB Output is correct
12 Correct 44 ms 44608 KB Output is correct
13 Correct 44 ms 44628 KB Output is correct
14 Correct 44 ms 44544 KB Output is correct
15 Correct 49 ms 44640 KB Output is correct
16 Correct 60 ms 44748 KB Output is correct
17 Correct 54 ms 44680 KB Output is correct
18 Correct 40 ms 44596 KB Output is correct
19 Execution timed out 1591 ms 45748 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 44500 KB Output is correct
2 Correct 21 ms 44628 KB Output is correct
3 Correct 43 ms 44520 KB Output is correct
4 Correct 44 ms 44628 KB Output is correct
5 Correct 45 ms 44620 KB Output is correct
6 Correct 45 ms 44628 KB Output is correct
7 Correct 53 ms 44628 KB Output is correct
8 Correct 50 ms 44668 KB Output is correct
9 Correct 39 ms 44500 KB Output is correct
10 Correct 19 ms 44492 KB Output is correct
11 Correct 20 ms 44540 KB Output is correct
12 Correct 44 ms 44600 KB Output is correct
13 Correct 52 ms 44564 KB Output is correct
14 Correct 48 ms 44548 KB Output is correct
15 Correct 48 ms 44628 KB Output is correct
16 Correct 52 ms 44664 KB Output is correct
17 Correct 53 ms 44668 KB Output is correct
18 Correct 40 ms 44500 KB Output is correct
19 Execution timed out 1572 ms 51620 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1592 ms 52456 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 44500 KB Output is correct
2 Execution timed out 1594 ms 52436 KB Time limit exceeded
3 Halted 0 ms 0 KB -