답안 #161035

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
161035 2019-10-31T09:53:40 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
80 / 100
5000 ms 397564 KB
#include <bits/stdc++.h>
    
#define ll long long
#define all(aaa) aaa.begin(), aaa.end()
 
using namespace std;
 
struct E {
    int p, t, x, y;
};
 
struct U {
    int l, r;
    pair<int, pair<int, int>> p;
};
 
const int N = 3e5 + 5, INF = 1e9, MAX = 1e8;
int n, q, k, cq, cc;
int ans[N];
pair<int, int> lt[N], tmp[N];
map<pair<int, int>, vector<int>> mp[N];
bool ok[N];
 
vector<int> vx;
multiset<int> occ[N];
vector<pair<int, pair<int, int>>> t[N * 4];
vector<U> updates;
 
void upd(int l, int r, pair<int, 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);
    }
}

bool dummy(int y) {
    return abs(y) == INF || abs(INF - y) == INF;
}
 
void startSeg(int x, pair<int, int> y) {
    if (dummy(y.first) && dummy(y.second))
        return;
    mp[x][y].push_back(cq);
}
 
void endSeg(int x, pair<int, int> y) {
    if (dummy(y.first) && dummy(y.second))
        return;
    auto &v = mp[x][y];
    if (v.size() == 1)
        updates.push_back({v.back(), cq - 1, {x, y}});
    v.pop_back();
}

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, INF - x});
    else
        endSeg(m1, {y, INF - x});
}
 
void calcAns(int v, int L, int R) {
    if (L == R) {
        tmp[0] = lt[L];
    }
    else {
        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 = 0; j <= R - L; j++) {
        while (i < t[v].size() && t[v][i].first <= tmp[j].first) {
            mx = max(mx, t[v][i].second.first);
            i++;
        }
        ans[tmp[j].second] = max(ans[tmp[j].second], mx - vx[tmp[j].first]);
    }    
 
    reverse(tmp, tmp + R - L + 1);
 
    for (int j = 0; j <= R - L; j++)
        tmp[j].first = cc - 1 - tmp[j].first;

    // for (auto p : t[v]) {
    //     cout << p.first << " " << p.second.second << "\n";
    // }
    // for (auto p : t[v]) {
    //     cout << p.first << " " << p.second << "\n";
    // }

    reverse(all(t[v]));
    for (auto &p : t[v]) {
        p.first = cc - p.first;
    }

    


    i = 0, mx = -INF;
    for (int j = 0; j <= R - L; j++) {
        while (i < t[v].size() && t[v][i].first <= tmp[j].first) {
            mx = max(mx, t[v][i].second.second);
            i++;
        }
        ans[tmp[j].second] = max(ans[tmp[j].second], mx - INF + vx[cc - 1 - tmp[j].first]);
    }
}
 
void calcUpdates(vector<E> &evs) { 
    for (E &e : evs) {
        if (e.t == 2)
            vx.push_back(e.x);
    }
 
    sort(all(vx));
    vx.erase(unique(all(vx)), vx.end());
 
    cc = vx.size();
 
    cq = 0;

    int types_on = 0;
 
    for (E &e : evs) {
        // cout << e.p << " " << e.t << " " << e.x << " " << e.y << "\n";
        if (e.t == 0) {
            auto it = occ[e.y].upper_bound(e.x);

            updBetween(*prev(it), *it, false);
            
            if (occ[e.y].size() == 2)
                types_on++;
 
            it = occ[e.y].insert(e.x);

            updBetween(*prev(it), e.x, true);
            updBetween(e.x, *next(it), true);
 
        }
        else if (e.t == 1) {
            auto it = occ[e.y].find(e.x);

            updBetween(*prev(it), *it, false);
            updBetween(*it, *next(it), false);
            updBetween(*prev(it), *next(it), true);

            occ[e.y].erase(it);

            if (occ[e.y].size() == 2)
                types_on--;
        }
        else {
            ok[e.y] = (types_on == k);
            lt[cq++] = {lower_bound(all(vx), e.x) - vx.begin(), e.y};
        }
    }
 
    sort(all(updates), [](const U &a, const U &b) {
        return a.p.first < b.p.first;
    });
}
 
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});
    }
 
    for (int i = 0; i < q; i++) {
        int x, y;
        cin >> x >> y;
        evs.push_back({y, 2, x, i});
    }

    for (int i = 0; i < k; i++) {
        occ[i].insert(-INF);
        occ[i].insert(INF);
    }
 
    sort(all(evs), [](const E &a, const E &b) {
        return a.p == b.p ? a.t < b.t : a.p < b.p;
    });
 
    calcUpdates(evs);
 
    for (U &u : updates) {
        upd(u.l, u.r, u.p, 1, 0, q - 1);
    }
 
    calcAns(1, 0, q - 1);
 
    for (int i = 0; i < q; i++) {
        if (ok[i]) {
            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:99:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i < t[v].size() && t[v][i].first <= tmp[j].first) {
                ~~^~~~~~~~~~~~~
new_home.cpp:128:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i < t[v].size() && t[v][i].first <= tmp[j].first) {
                ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 56696 KB Output is correct
2 Correct 53 ms 56696 KB Output is correct
3 Correct 54 ms 56696 KB Output is correct
4 Correct 53 ms 56696 KB Output is correct
5 Correct 55 ms 56824 KB Output is correct
6 Correct 57 ms 57052 KB Output is correct
7 Correct 63 ms 57052 KB Output is correct
8 Correct 62 ms 57080 KB Output is correct
9 Correct 58 ms 57084 KB Output is correct
10 Correct 58 ms 57080 KB Output is correct
11 Correct 57 ms 57052 KB Output is correct
12 Correct 56 ms 56952 KB Output is correct
13 Correct 63 ms 56952 KB Output is correct
14 Correct 63 ms 56952 KB Output is correct
15 Correct 63 ms 57088 KB Output is correct
16 Correct 63 ms 57000 KB Output is correct
17 Correct 64 ms 57080 KB Output is correct
18 Correct 64 ms 57100 KB Output is correct
19 Correct 57 ms 57080 KB Output is correct
20 Correct 64 ms 57080 KB Output is correct
21 Correct 57 ms 56924 KB Output is correct
22 Correct 58 ms 57084 KB Output is correct
23 Correct 59 ms 57080 KB Output is correct
24 Correct 56 ms 57080 KB Output is correct
25 Correct 55 ms 57080 KB Output is correct
26 Correct 58 ms 57052 KB Output is correct
27 Correct 58 ms 57080 KB Output is correct
28 Correct 58 ms 56952 KB Output is correct
29 Correct 56 ms 57012 KB Output is correct
30 Correct 56 ms 56952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 56696 KB Output is correct
2 Correct 53 ms 56696 KB Output is correct
3 Correct 54 ms 56696 KB Output is correct
4 Correct 53 ms 56696 KB Output is correct
5 Correct 55 ms 56824 KB Output is correct
6 Correct 57 ms 57052 KB Output is correct
7 Correct 63 ms 57052 KB Output is correct
8 Correct 62 ms 57080 KB Output is correct
9 Correct 58 ms 57084 KB Output is correct
10 Correct 58 ms 57080 KB Output is correct
11 Correct 57 ms 57052 KB Output is correct
12 Correct 56 ms 56952 KB Output is correct
13 Correct 63 ms 56952 KB Output is correct
14 Correct 63 ms 56952 KB Output is correct
15 Correct 63 ms 57088 KB Output is correct
16 Correct 63 ms 57000 KB Output is correct
17 Correct 64 ms 57080 KB Output is correct
18 Correct 64 ms 57100 KB Output is correct
19 Correct 57 ms 57080 KB Output is correct
20 Correct 64 ms 57080 KB Output is correct
21 Correct 57 ms 56924 KB Output is correct
22 Correct 58 ms 57084 KB Output is correct
23 Correct 59 ms 57080 KB Output is correct
24 Correct 56 ms 57080 KB Output is correct
25 Correct 55 ms 57080 KB Output is correct
26 Correct 58 ms 57052 KB Output is correct
27 Correct 58 ms 57080 KB Output is correct
28 Correct 58 ms 56952 KB Output is correct
29 Correct 56 ms 57012 KB Output is correct
30 Correct 56 ms 56952 KB Output is correct
31 Correct 873 ms 120876 KB Output is correct
32 Correct 175 ms 63072 KB Output is correct
33 Correct 792 ms 118108 KB Output is correct
34 Correct 779 ms 118212 KB Output is correct
35 Correct 837 ms 120964 KB Output is correct
36 Correct 831 ms 120748 KB Output is correct
37 Correct 569 ms 112052 KB Output is correct
38 Correct 553 ms 111588 KB Output is correct
39 Correct 472 ms 101972 KB Output is correct
40 Correct 473 ms 104188 KB Output is correct
41 Correct 709 ms 110264 KB Output is correct
42 Correct 654 ms 110780 KB Output is correct
43 Correct 148 ms 65492 KB Output is correct
44 Correct 691 ms 109528 KB Output is correct
45 Correct 614 ms 104172 KB Output is correct
46 Correct 557 ms 95084 KB Output is correct
47 Correct 346 ms 91960 KB Output is correct
48 Correct 353 ms 90640 KB Output is correct
49 Correct 426 ms 97252 KB Output is correct
50 Correct 536 ms 106700 KB Output is correct
51 Correct 438 ms 94848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3025 ms 202708 KB Output is correct
2 Correct 2934 ms 203896 KB Output is correct
3 Correct 2557 ms 222108 KB Output is correct
4 Correct 2967 ms 206008 KB Output is correct
5 Correct 2746 ms 199780 KB Output is correct
6 Correct 2948 ms 203288 KB Output is correct
7 Correct 2618 ms 221680 KB Output is correct
8 Correct 2459 ms 207652 KB Output is correct
9 Correct 2407 ms 204896 KB Output is correct
10 Correct 2571 ms 207800 KB Output is correct
11 Correct 1621 ms 204368 KB Output is correct
12 Correct 1792 ms 205880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4400 ms 310608 KB Output is correct
2 Correct 726 ms 97216 KB Output is correct
3 Correct 4393 ms 322644 KB Output is correct
4 Correct 3194 ms 297828 KB Output is correct
5 Correct 4317 ms 318264 KB Output is correct
6 Correct 3900 ms 313892 KB Output is correct
7 Correct 4211 ms 321976 KB Output is correct
8 Correct 4245 ms 322748 KB Output is correct
9 Correct 2898 ms 297320 KB Output is correct
10 Correct 3817 ms 309876 KB Output is correct
11 Correct 4142 ms 321284 KB Output is correct
12 Correct 4134 ms 321616 KB Output is correct
13 Correct 2179 ms 269168 KB Output is correct
14 Correct 1984 ms 265880 KB Output is correct
15 Correct 2326 ms 284564 KB Output is correct
16 Correct 2663 ms 299108 KB Output is correct
17 Correct 2563 ms 291880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 56696 KB Output is correct
2 Correct 53 ms 56696 KB Output is correct
3 Correct 54 ms 56696 KB Output is correct
4 Correct 53 ms 56696 KB Output is correct
5 Correct 55 ms 56824 KB Output is correct
6 Correct 57 ms 57052 KB Output is correct
7 Correct 63 ms 57052 KB Output is correct
8 Correct 62 ms 57080 KB Output is correct
9 Correct 58 ms 57084 KB Output is correct
10 Correct 58 ms 57080 KB Output is correct
11 Correct 57 ms 57052 KB Output is correct
12 Correct 56 ms 56952 KB Output is correct
13 Correct 63 ms 56952 KB Output is correct
14 Correct 63 ms 56952 KB Output is correct
15 Correct 63 ms 57088 KB Output is correct
16 Correct 63 ms 57000 KB Output is correct
17 Correct 64 ms 57080 KB Output is correct
18 Correct 64 ms 57100 KB Output is correct
19 Correct 57 ms 57080 KB Output is correct
20 Correct 64 ms 57080 KB Output is correct
21 Correct 57 ms 56924 KB Output is correct
22 Correct 58 ms 57084 KB Output is correct
23 Correct 59 ms 57080 KB Output is correct
24 Correct 56 ms 57080 KB Output is correct
25 Correct 55 ms 57080 KB Output is correct
26 Correct 58 ms 57052 KB Output is correct
27 Correct 58 ms 57080 KB Output is correct
28 Correct 58 ms 56952 KB Output is correct
29 Correct 56 ms 57012 KB Output is correct
30 Correct 56 ms 56952 KB Output is correct
31 Correct 873 ms 120876 KB Output is correct
32 Correct 175 ms 63072 KB Output is correct
33 Correct 792 ms 118108 KB Output is correct
34 Correct 779 ms 118212 KB Output is correct
35 Correct 837 ms 120964 KB Output is correct
36 Correct 831 ms 120748 KB Output is correct
37 Correct 569 ms 112052 KB Output is correct
38 Correct 553 ms 111588 KB Output is correct
39 Correct 472 ms 101972 KB Output is correct
40 Correct 473 ms 104188 KB Output is correct
41 Correct 709 ms 110264 KB Output is correct
42 Correct 654 ms 110780 KB Output is correct
43 Correct 148 ms 65492 KB Output is correct
44 Correct 691 ms 109528 KB Output is correct
45 Correct 614 ms 104172 KB Output is correct
46 Correct 557 ms 95084 KB Output is correct
47 Correct 346 ms 91960 KB Output is correct
48 Correct 353 ms 90640 KB Output is correct
49 Correct 426 ms 97252 KB Output is correct
50 Correct 536 ms 106700 KB Output is correct
51 Correct 438 ms 94848 KB Output is correct
52 Correct 640 ms 113148 KB Output is correct
53 Correct 616 ms 108968 KB Output is correct
54 Correct 752 ms 118916 KB Output is correct
55 Correct 660 ms 116120 KB Output is correct
56 Correct 674 ms 116948 KB Output is correct
57 Correct 665 ms 111916 KB Output is correct
58 Correct 664 ms 112964 KB Output is correct
59 Correct 679 ms 114084 KB Output is correct
60 Correct 717 ms 111704 KB Output is correct
61 Correct 157 ms 71576 KB Output is correct
62 Correct 599 ms 116188 KB Output is correct
63 Correct 822 ms 119504 KB Output is correct
64 Correct 815 ms 120976 KB Output is correct
65 Correct 772 ms 120480 KB Output is correct
66 Correct 713 ms 114000 KB Output is correct
67 Correct 195 ms 64088 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 56696 KB Output is correct
2 Correct 53 ms 56696 KB Output is correct
3 Correct 54 ms 56696 KB Output is correct
4 Correct 53 ms 56696 KB Output is correct
5 Correct 55 ms 56824 KB Output is correct
6 Correct 57 ms 57052 KB Output is correct
7 Correct 63 ms 57052 KB Output is correct
8 Correct 62 ms 57080 KB Output is correct
9 Correct 58 ms 57084 KB Output is correct
10 Correct 58 ms 57080 KB Output is correct
11 Correct 57 ms 57052 KB Output is correct
12 Correct 56 ms 56952 KB Output is correct
13 Correct 63 ms 56952 KB Output is correct
14 Correct 63 ms 56952 KB Output is correct
15 Correct 63 ms 57088 KB Output is correct
16 Correct 63 ms 57000 KB Output is correct
17 Correct 64 ms 57080 KB Output is correct
18 Correct 64 ms 57100 KB Output is correct
19 Correct 57 ms 57080 KB Output is correct
20 Correct 64 ms 57080 KB Output is correct
21 Correct 57 ms 56924 KB Output is correct
22 Correct 58 ms 57084 KB Output is correct
23 Correct 59 ms 57080 KB Output is correct
24 Correct 56 ms 57080 KB Output is correct
25 Correct 55 ms 57080 KB Output is correct
26 Correct 58 ms 57052 KB Output is correct
27 Correct 58 ms 57080 KB Output is correct
28 Correct 58 ms 56952 KB Output is correct
29 Correct 56 ms 57012 KB Output is correct
30 Correct 56 ms 56952 KB Output is correct
31 Correct 873 ms 120876 KB Output is correct
32 Correct 175 ms 63072 KB Output is correct
33 Correct 792 ms 118108 KB Output is correct
34 Correct 779 ms 118212 KB Output is correct
35 Correct 837 ms 120964 KB Output is correct
36 Correct 831 ms 120748 KB Output is correct
37 Correct 569 ms 112052 KB Output is correct
38 Correct 553 ms 111588 KB Output is correct
39 Correct 472 ms 101972 KB Output is correct
40 Correct 473 ms 104188 KB Output is correct
41 Correct 709 ms 110264 KB Output is correct
42 Correct 654 ms 110780 KB Output is correct
43 Correct 148 ms 65492 KB Output is correct
44 Correct 691 ms 109528 KB Output is correct
45 Correct 614 ms 104172 KB Output is correct
46 Correct 557 ms 95084 KB Output is correct
47 Correct 346 ms 91960 KB Output is correct
48 Correct 353 ms 90640 KB Output is correct
49 Correct 426 ms 97252 KB Output is correct
50 Correct 536 ms 106700 KB Output is correct
51 Correct 438 ms 94848 KB Output is correct
52 Correct 3025 ms 202708 KB Output is correct
53 Correct 2934 ms 203896 KB Output is correct
54 Correct 2557 ms 222108 KB Output is correct
55 Correct 2967 ms 206008 KB Output is correct
56 Correct 2746 ms 199780 KB Output is correct
57 Correct 2948 ms 203288 KB Output is correct
58 Correct 2618 ms 221680 KB Output is correct
59 Correct 2459 ms 207652 KB Output is correct
60 Correct 2407 ms 204896 KB Output is correct
61 Correct 2571 ms 207800 KB Output is correct
62 Correct 1621 ms 204368 KB Output is correct
63 Correct 1792 ms 205880 KB Output is correct
64 Correct 4400 ms 310608 KB Output is correct
65 Correct 726 ms 97216 KB Output is correct
66 Correct 4393 ms 322644 KB Output is correct
67 Correct 3194 ms 297828 KB Output is correct
68 Correct 4317 ms 318264 KB Output is correct
69 Correct 3900 ms 313892 KB Output is correct
70 Correct 4211 ms 321976 KB Output is correct
71 Correct 4245 ms 322748 KB Output is correct
72 Correct 2898 ms 297320 KB Output is correct
73 Correct 3817 ms 309876 KB Output is correct
74 Correct 4142 ms 321284 KB Output is correct
75 Correct 4134 ms 321616 KB Output is correct
76 Correct 2179 ms 269168 KB Output is correct
77 Correct 1984 ms 265880 KB Output is correct
78 Correct 2326 ms 284564 KB Output is correct
79 Correct 2663 ms 299108 KB Output is correct
80 Correct 2563 ms 291880 KB Output is correct
81 Correct 640 ms 113148 KB Output is correct
82 Correct 616 ms 108968 KB Output is correct
83 Correct 752 ms 118916 KB Output is correct
84 Correct 660 ms 116120 KB Output is correct
85 Correct 674 ms 116948 KB Output is correct
86 Correct 665 ms 111916 KB Output is correct
87 Correct 664 ms 112964 KB Output is correct
88 Correct 679 ms 114084 KB Output is correct
89 Correct 717 ms 111704 KB Output is correct
90 Correct 157 ms 71576 KB Output is correct
91 Correct 599 ms 116188 KB Output is correct
92 Correct 822 ms 119504 KB Output is correct
93 Correct 815 ms 120976 KB Output is correct
94 Correct 772 ms 120480 KB Output is correct
95 Correct 713 ms 114000 KB Output is correct
96 Correct 195 ms 64088 KB Output is correct
97 Correct 4106 ms 382252 KB Output is correct
98 Correct 815 ms 90432 KB Output is correct
99 Execution timed out 5082 ms 397564 KB Time limit exceeded
100 Halted 0 ms 0 KB -