답안 #160958

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
160958 2019-10-30T19:55:24 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
47 / 100
5000 ms 291016 KB
#include <bits/stdc++.h>
    
#define ll long long
#define all(aaa) aaa.begin(), aaa.end()
 
#pragma GCC optimize("Ofast")
  
using namespace std;
 
struct E {
    int p, t, x, y;
};
 
struct U {
    int l, r;
    pair<int, int> p;
};
 
const int N = 3e5 + 5, INF = 1e9, MAX = 1e8;
int n, q, k, cc, cq;
int ans[N];
pair<int, int> lt[N], tmp[N];
unordered_map<int, vector<int>> mp[N];
 
vector<int> vx;
multiset<int> occ[N];
vector<pair<int, int>> t[N * 4], t2[N * 4];
vector<U> updates;
 
void upd(int l, int r, pair<int, int> p, int v, int L, int R) {
    if (l > r)
        return;
    if (L == l && R == r) {
        t[v].push_back(p);
    }
    else {
        int m = (L + R) >> 1;
        upd(l, min(m, r), p, v * 2, L, m);
        upd(max(m + 1, l), r, p, v * 2 + 1, m + 1, R);
    }
}
 
void startSeg(int x, int y) {
    mp[x][y].push_back(cq);
}
 
void endSeg(int x, int y) {
    updates.push_back({mp[x][y].back(), cq - 1, {x, y}});
    mp[x][y].pop_back();
}
 
void updBeg(int x, bool add) {
    if (add)
        startSeg(0, x);
    else
        endSeg(0, x);
}
 
void updBetween(int x, int y, bool add) {
    if (x == y)
        return;
    int m = (x + y) / 2;
    if ((x + y) % 2)
        m++;
 
    int m1 = lower_bound(all(vx), m) - vx.begin();
    if (add)
        startSeg(m1, y);
    else
        endSeg(m1, y);  
}
 
void calcAns(int v, int L, int R) {
    if (L != R) {
        int m = (L + R) >> 1;
        calcAns(v * 2, L, m);
        calcAns(v * 2 + 1, m + 1, R);
        
        int x = L, y = m + 1, z = 0;
        while (x <= m || y <= R) {
            if (x <= m && (y == R + 1 || lt[x].first < lt[y].first))
                tmp[z] = lt[x++];
            else 
                tmp[z] = lt[y++];
            z++;
        }
        for (int i = L; i <= R; i++)
            lt[i] = tmp[i - L];
    }
 
    int i = 0, mx = -INF;
    for (int j = L; j <= R; j++) {
        while (i < t[v].size() && t[v][i].first <= lt[j].first) {
            mx = max(mx, t[v][i].second);
            i++;
        }
        ans[lt[j].second] = max(ans[lt[j].second], mx - vx[lt[j].first]);
    }
}
 
void solve(vector<E> evs) {
    vx.clear();
    updates.clear();
 
 
    for (int i = 0; i < N; i++) {
        occ[i].clear();
        mp[i].clear();
    }
 
    for (int i = 0; i < N * 4; i++) {
        t[i].clear();
        t2[i].clear();
    }
 
    for (E e : evs) {
        if (e.t == 2)
            vx.push_back(e.x);
    }
 
    sort(all(vx));
    vx.erase(unique(all(vx)), vx.end());
 
    cq = 0;
 
    for (E e : evs) {
        if (e.t == 0) {
            auto it = occ[e.y].upper_bound(e.x);
            if (!occ[e.y].empty()) {
                if (it != occ[e.y].begin() && it != occ[e.y].end()) {
                    updBetween(*prev(it), *it, false);
                }
                if (it == occ[e.y].begin()) {
                    updBeg(*it, false);
                }
            }
 
            it = occ[e.y].insert(e.x);
 
            if (it == occ[e.y].begin()) 
                updBeg(*it, true);
            else
                updBetween(*prev(it), *it, true);
 
            if (next(it) != occ[e.y].end())
                updBetween(*it, *next(it), true);
 
        }
        else if (e.t == 1) {
            auto it = occ[e.y].find(e.x);
 
            if (it == occ[e.y].begin()) 
                updBeg(*it, false);
            else
                updBetween(*prev(it), *it, false);
 
            if (next(it) != occ[e.y].end())
                updBetween(*it, *next(it), false);
 
            if (it != occ[e.y].begin() && next(it) != occ[e.y].end())
                updBetween(*prev(it), *next(it), true);
            if (it == occ[e.y].begin() && occ[e.y].size() > 1)
                updBeg(*next(it), true);
 
            occ[e.y].erase(it);
        }
        else {
            lt[cq] = {lower_bound(all(vx), e.x) - vx.begin(), e.y};
            cq++;
        }
    }
 
    sort(all(updates), [](const U &a, const U &b) {
        return a.p.first < b.p.first;
    });
 
    for (U u : updates) {
        upd(u.l, u.r, u.p, 1, 0, q - 1);
    }
 
    calcAns(1, 0, q - 1);
}
 
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
 
    cin >> n >> k >> q;
 
    vector<E> evs;
 
    for (int i = 0; i < n; i++) {
        int x, t, a, b;
        cin >> x >> t >> a >> b;
        t--;
        evs.push_back({a, 0, x, t});
        evs.push_back({b + 1, 1, x, t});
        vx.push_back(x);
    }
 
    for (int i = 0; i < k; i++) {
        evs.push_back({1, 0, INF, i});
        evs.push_back({MAX, 1, INF, i});
    }
 
    for (int i = 0; i < q; i++) {
        int x, y;
        cin >> x >> y;
        evs.push_back({y, 2, x, i});
    }
 
    sort(all(evs), [](const E &a, const E &b) {
        return a.p == b.p ? a.t < b.t : a.p < b.p;
    });
 
    solve(evs);
    for (E &e : evs)
        e.x = INF - e.x;
    solve(evs);
 
    for (int i = 0; i < q; i++) {
        if (ans[i] < INF / 2) {
            cout << ans[i] << "\n";
        }
        else {
            cout << "-1\n";
        }
    }
 
    return 0;
}

Compilation message

new_home.cpp: In function 'void calcAns(int, int, int)':
new_home.cpp:93:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i < t[v].size() && t[v][i].first <= lt[j].first) {
                ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 87404 KB Output is correct
2 Correct 108 ms 87288 KB Output is correct
3 Correct 107 ms 87288 KB Output is correct
4 Correct 109 ms 87280 KB Output is correct
5 Correct 109 ms 87288 KB Output is correct
6 Correct 112 ms 87544 KB Output is correct
7 Correct 111 ms 87516 KB Output is correct
8 Correct 111 ms 87588 KB Output is correct
9 Correct 109 ms 87672 KB Output is correct
10 Correct 110 ms 87544 KB Output is correct
11 Correct 108 ms 87420 KB Output is correct
12 Correct 109 ms 87416 KB Output is correct
13 Correct 112 ms 87420 KB Output is correct
14 Correct 110 ms 87416 KB Output is correct
15 Correct 111 ms 87588 KB Output is correct
16 Correct 111 ms 87548 KB Output is correct
17 Correct 113 ms 87528 KB Output is correct
18 Correct 111 ms 87516 KB Output is correct
19 Correct 109 ms 87456 KB Output is correct
20 Correct 109 ms 87556 KB Output is correct
21 Correct 117 ms 87388 KB Output is correct
22 Correct 110 ms 87544 KB Output is correct
23 Correct 116 ms 87572 KB Output is correct
24 Correct 118 ms 87620 KB Output is correct
25 Correct 116 ms 87648 KB Output is correct
26 Correct 112 ms 87416 KB Output is correct
27 Correct 112 ms 87500 KB Output is correct
28 Correct 120 ms 87516 KB Output is correct
29 Correct 110 ms 87416 KB Output is correct
30 Correct 118 ms 87464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 87404 KB Output is correct
2 Correct 108 ms 87288 KB Output is correct
3 Correct 107 ms 87288 KB Output is correct
4 Correct 109 ms 87280 KB Output is correct
5 Correct 109 ms 87288 KB Output is correct
6 Correct 112 ms 87544 KB Output is correct
7 Correct 111 ms 87516 KB Output is correct
8 Correct 111 ms 87588 KB Output is correct
9 Correct 109 ms 87672 KB Output is correct
10 Correct 110 ms 87544 KB Output is correct
11 Correct 108 ms 87420 KB Output is correct
12 Correct 109 ms 87416 KB Output is correct
13 Correct 112 ms 87420 KB Output is correct
14 Correct 110 ms 87416 KB Output is correct
15 Correct 111 ms 87588 KB Output is correct
16 Correct 111 ms 87548 KB Output is correct
17 Correct 113 ms 87528 KB Output is correct
18 Correct 111 ms 87516 KB Output is correct
19 Correct 109 ms 87456 KB Output is correct
20 Correct 109 ms 87556 KB Output is correct
21 Correct 117 ms 87388 KB Output is correct
22 Correct 110 ms 87544 KB Output is correct
23 Correct 116 ms 87572 KB Output is correct
24 Correct 118 ms 87620 KB Output is correct
25 Correct 116 ms 87648 KB Output is correct
26 Correct 112 ms 87416 KB Output is correct
27 Correct 112 ms 87500 KB Output is correct
28 Correct 120 ms 87516 KB Output is correct
29 Correct 110 ms 87416 KB Output is correct
30 Correct 118 ms 87464 KB Output is correct
31 Correct 1401 ms 138532 KB Output is correct
32 Correct 432 ms 99064 KB Output is correct
33 Correct 1601 ms 136904 KB Output is correct
34 Correct 1296 ms 137032 KB Output is correct
35 Correct 1386 ms 138728 KB Output is correct
36 Correct 1345 ms 137976 KB Output is correct
37 Correct 963 ms 133140 KB Output is correct
38 Correct 922 ms 131320 KB Output is correct
39 Correct 1004 ms 125432 KB Output is correct
40 Correct 788 ms 126220 KB Output is correct
41 Correct 873 ms 123976 KB Output is correct
42 Correct 854 ms 124380 KB Output is correct
43 Correct 252 ms 100196 KB Output is correct
44 Correct 894 ms 123392 KB Output is correct
45 Correct 808 ms 120964 KB Output is correct
46 Correct 736 ms 116436 KB Output is correct
47 Correct 528 ms 114124 KB Output is correct
48 Correct 524 ms 113252 KB Output is correct
49 Correct 610 ms 117260 KB Output is correct
50 Correct 693 ms 122244 KB Output is correct
51 Correct 621 ms 116084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4332 ms 216060 KB Output is correct
2 Execution timed out 5018 ms 221024 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5082 ms 291016 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 87404 KB Output is correct
2 Correct 108 ms 87288 KB Output is correct
3 Correct 107 ms 87288 KB Output is correct
4 Correct 109 ms 87280 KB Output is correct
5 Correct 109 ms 87288 KB Output is correct
6 Correct 112 ms 87544 KB Output is correct
7 Correct 111 ms 87516 KB Output is correct
8 Correct 111 ms 87588 KB Output is correct
9 Correct 109 ms 87672 KB Output is correct
10 Correct 110 ms 87544 KB Output is correct
11 Correct 108 ms 87420 KB Output is correct
12 Correct 109 ms 87416 KB Output is correct
13 Correct 112 ms 87420 KB Output is correct
14 Correct 110 ms 87416 KB Output is correct
15 Correct 111 ms 87588 KB Output is correct
16 Correct 111 ms 87548 KB Output is correct
17 Correct 113 ms 87528 KB Output is correct
18 Correct 111 ms 87516 KB Output is correct
19 Correct 109 ms 87456 KB Output is correct
20 Correct 109 ms 87556 KB Output is correct
21 Correct 117 ms 87388 KB Output is correct
22 Correct 110 ms 87544 KB Output is correct
23 Correct 116 ms 87572 KB Output is correct
24 Correct 118 ms 87620 KB Output is correct
25 Correct 116 ms 87648 KB Output is correct
26 Correct 112 ms 87416 KB Output is correct
27 Correct 112 ms 87500 KB Output is correct
28 Correct 120 ms 87516 KB Output is correct
29 Correct 110 ms 87416 KB Output is correct
30 Correct 118 ms 87464 KB Output is correct
31 Correct 1401 ms 138532 KB Output is correct
32 Correct 432 ms 99064 KB Output is correct
33 Correct 1601 ms 136904 KB Output is correct
34 Correct 1296 ms 137032 KB Output is correct
35 Correct 1386 ms 138728 KB Output is correct
36 Correct 1345 ms 137976 KB Output is correct
37 Correct 963 ms 133140 KB Output is correct
38 Correct 922 ms 131320 KB Output is correct
39 Correct 1004 ms 125432 KB Output is correct
40 Correct 788 ms 126220 KB Output is correct
41 Correct 873 ms 123976 KB Output is correct
42 Correct 854 ms 124380 KB Output is correct
43 Correct 252 ms 100196 KB Output is correct
44 Correct 894 ms 123392 KB Output is correct
45 Correct 808 ms 120964 KB Output is correct
46 Correct 736 ms 116436 KB Output is correct
47 Correct 528 ms 114124 KB Output is correct
48 Correct 524 ms 113252 KB Output is correct
49 Correct 610 ms 117260 KB Output is correct
50 Correct 693 ms 122244 KB Output is correct
51 Correct 621 ms 116084 KB Output is correct
52 Correct 801 ms 142036 KB Output is correct
53 Correct 701 ms 128556 KB Output is correct
54 Correct 1034 ms 135464 KB Output is correct
55 Correct 847 ms 132732 KB Output is correct
56 Correct 777 ms 135248 KB Output is correct
57 Correct 906 ms 126376 KB Output is correct
58 Correct 824 ms 130452 KB Output is correct
59 Correct 815 ms 133900 KB Output is correct
60 Correct 1012 ms 126052 KB Output is correct
61 Correct 306 ms 111528 KB Output is correct
62 Correct 747 ms 143384 KB Output is correct
63 Correct 850 ms 136444 KB Output is correct
64 Correct 987 ms 134856 KB Output is correct
65 Correct 958 ms 131624 KB Output is correct
66 Correct 909 ms 126108 KB Output is correct
67 Correct 369 ms 107128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 87404 KB Output is correct
2 Correct 108 ms 87288 KB Output is correct
3 Correct 107 ms 87288 KB Output is correct
4 Correct 109 ms 87280 KB Output is correct
5 Correct 109 ms 87288 KB Output is correct
6 Correct 112 ms 87544 KB Output is correct
7 Correct 111 ms 87516 KB Output is correct
8 Correct 111 ms 87588 KB Output is correct
9 Correct 109 ms 87672 KB Output is correct
10 Correct 110 ms 87544 KB Output is correct
11 Correct 108 ms 87420 KB Output is correct
12 Correct 109 ms 87416 KB Output is correct
13 Correct 112 ms 87420 KB Output is correct
14 Correct 110 ms 87416 KB Output is correct
15 Correct 111 ms 87588 KB Output is correct
16 Correct 111 ms 87548 KB Output is correct
17 Correct 113 ms 87528 KB Output is correct
18 Correct 111 ms 87516 KB Output is correct
19 Correct 109 ms 87456 KB Output is correct
20 Correct 109 ms 87556 KB Output is correct
21 Correct 117 ms 87388 KB Output is correct
22 Correct 110 ms 87544 KB Output is correct
23 Correct 116 ms 87572 KB Output is correct
24 Correct 118 ms 87620 KB Output is correct
25 Correct 116 ms 87648 KB Output is correct
26 Correct 112 ms 87416 KB Output is correct
27 Correct 112 ms 87500 KB Output is correct
28 Correct 120 ms 87516 KB Output is correct
29 Correct 110 ms 87416 KB Output is correct
30 Correct 118 ms 87464 KB Output is correct
31 Correct 1401 ms 138532 KB Output is correct
32 Correct 432 ms 99064 KB Output is correct
33 Correct 1601 ms 136904 KB Output is correct
34 Correct 1296 ms 137032 KB Output is correct
35 Correct 1386 ms 138728 KB Output is correct
36 Correct 1345 ms 137976 KB Output is correct
37 Correct 963 ms 133140 KB Output is correct
38 Correct 922 ms 131320 KB Output is correct
39 Correct 1004 ms 125432 KB Output is correct
40 Correct 788 ms 126220 KB Output is correct
41 Correct 873 ms 123976 KB Output is correct
42 Correct 854 ms 124380 KB Output is correct
43 Correct 252 ms 100196 KB Output is correct
44 Correct 894 ms 123392 KB Output is correct
45 Correct 808 ms 120964 KB Output is correct
46 Correct 736 ms 116436 KB Output is correct
47 Correct 528 ms 114124 KB Output is correct
48 Correct 524 ms 113252 KB Output is correct
49 Correct 610 ms 117260 KB Output is correct
50 Correct 693 ms 122244 KB Output is correct
51 Correct 621 ms 116084 KB Output is correct
52 Correct 4332 ms 216060 KB Output is correct
53 Execution timed out 5018 ms 221024 KB Time limit exceeded
54 Halted 0 ms 0 KB -