답안 #161026

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
161026 2019-10-31T09:08:01 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
57 / 100
5000 ms 433036 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, 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];
unordered_map<int, vector<int>> mp[2][N];
bool ok[N];
 
vector<int> vx;
multiset<int> occ[N];
vector<pair<int, int>> t[2][N * 4];
vector<U> updates[2];
 
void upd(int type, int l, int r, pair<int, int> p, int v, int L, int R) {
    if (l > r)
        return;
    if (L == l && R == r) {
        t[type][v].push_back(p);
    }
    else {
        int m = (L + R) >> 1;
        upd(type, l, min(m, r), p, v * 2, L, m);
        upd(type, max(m + 1, l), r, p, v * 2 + 1, m + 1, R);
    }
}
 
void startSeg(int type, int x, int y) {
    mp[type][x][y].push_back(cq);
}
 
void endSeg(int type, int x, int y) {
    auto &v = mp[type][x][y];
    if (v.size() == 1)
        updates[type].push_back({v.back(), cq - 1, {x, y}});
    v.pop_back();
}
 
void updBeg(int x, bool add) {
    if (add)
        startSeg(0, 0, x);
    else
        endSeg(0, 0, x);
}
 
void updBetween(int x, int y, bool add) {
    if (x == y)
        return;
    int m = (x + y) / 2;
    if ((x + y) % 2)
        m++;
 
    // cout << "BET " << x << " " << y << " " << add << "\n";
 
    int m1 = lower_bound(all(vx), m) - vx.begin();
    if (add) {
        startSeg(0, m1, y);
        startSeg(1, cc - m1, INF - x);
    }
    else {
        endSeg(0, m1, y);
        endSeg(1, cc - m1, INF - x);
    }
}
 
void updEnd(int x, bool add) {
    if (add)
        startSeg(1, 0, INF - x);
    else
        endSeg(1, 0, 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[0][v].size() && t[0][v][i].first <= tmp[j].first) {
            mx = max(mx, t[0][v][i].second);
            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 (int j = 0; j <= R - L; j++) {
    //     cout << tmp[j].first << " " << tmp[j].second << "\n";
    // }
 
    // for (auto p : t[1][v]) {
    //     cout << p.first << " " << p.second << "\n";
    // }
 
    // cout << ans[0] << "\n";
 
    i = 0, mx = -INF;
    for (int j = 0; j <= R - L; j++) {
        while (i < t[1][v].size() && t[1][v][i].first <= tmp[j].first) {
            mx = max(mx, t[1][v][i].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);
            int pr = (it == occ[e.y].begin() ? -1 : *prev(it)),
                cur = (it == occ[e.y].end() ? -1 : *it);
 
            if (!occ[e.y].empty()) {
                if (pr != -1 && cur != -1) {
                    updBetween(pr, cur, false);
                }
                if (pr == -1) {
                    updBeg(cur, false);
                }
                if (cur == -1) {
                    updEnd(pr, false);
                }
            }
            else {
                types_on++;
            }
 
            occ[e.y].insert(e.x);
 
            if (pr == -1)
                updBeg(e.x, true);
            else
                updBetween(pr, e.x, true);
 
            if (cur != -1)
                updBetween(e.x, cur, true);
            else
                updEnd(e.x, 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);
            else
                updEnd(e.x, 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);
 
            if (next(it) == occ[e.y].end() &&
                occ[e.y].size() > 1)
                updEnd(*prev(it), true);
 
            occ[e.y].erase(it);

            if (occ[e.y].empty())
                types_on--;
        }
        else {
            ok[e.y] = (types_on == k);
            lt[cq++] = {lower_bound(all(vx), e.x) - vx.begin(), e.y};
        }
    }
 
    for (int i = 0; i < 2; i++) {
        sort(all(updates[i]), [](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});
    }
 
    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 (int i = 0; i < 2; i++) {
        for (U &u : updates[i]) {
            upd(i, 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:110:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i < t[0][v].size() && t[0][v][i].first <= tmp[j].first) {
                ~~^~~~~~~~~~~~~~~~
new_home.cpp:134:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i < t[1][v].size() && t[1][v][i].first <= tmp[j].first) {
                ~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 103712 KB Output is correct
2 Correct 101 ms 103644 KB Output is correct
3 Correct 100 ms 103672 KB Output is correct
4 Correct 102 ms 103672 KB Output is correct
5 Correct 101 ms 103748 KB Output is correct
6 Correct 104 ms 104264 KB Output is correct
7 Correct 106 ms 103900 KB Output is correct
8 Correct 104 ms 104056 KB Output is correct
9 Correct 103 ms 103928 KB Output is correct
10 Correct 104 ms 104056 KB Output is correct
11 Correct 102 ms 103928 KB Output is correct
12 Correct 106 ms 103960 KB Output is correct
13 Correct 100 ms 103928 KB Output is correct
14 Correct 109 ms 103928 KB Output is correct
15 Correct 109 ms 104056 KB Output is correct
16 Correct 110 ms 104124 KB Output is correct
17 Correct 107 ms 104056 KB Output is correct
18 Correct 105 ms 104092 KB Output is correct
19 Correct 101 ms 104028 KB Output is correct
20 Correct 102 ms 104060 KB Output is correct
21 Correct 112 ms 103800 KB Output is correct
22 Correct 101 ms 104056 KB Output is correct
23 Correct 101 ms 104060 KB Output is correct
24 Correct 102 ms 104056 KB Output is correct
25 Correct 101 ms 104028 KB Output is correct
26 Correct 107 ms 104056 KB Output is correct
27 Correct 102 ms 103932 KB Output is correct
28 Correct 103 ms 103928 KB Output is correct
29 Correct 103 ms 104056 KB Output is correct
30 Correct 103 ms 103928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 103712 KB Output is correct
2 Correct 101 ms 103644 KB Output is correct
3 Correct 100 ms 103672 KB Output is correct
4 Correct 102 ms 103672 KB Output is correct
5 Correct 101 ms 103748 KB Output is correct
6 Correct 104 ms 104264 KB Output is correct
7 Correct 106 ms 103900 KB Output is correct
8 Correct 104 ms 104056 KB Output is correct
9 Correct 103 ms 103928 KB Output is correct
10 Correct 104 ms 104056 KB Output is correct
11 Correct 102 ms 103928 KB Output is correct
12 Correct 106 ms 103960 KB Output is correct
13 Correct 100 ms 103928 KB Output is correct
14 Correct 109 ms 103928 KB Output is correct
15 Correct 109 ms 104056 KB Output is correct
16 Correct 110 ms 104124 KB Output is correct
17 Correct 107 ms 104056 KB Output is correct
18 Correct 105 ms 104092 KB Output is correct
19 Correct 101 ms 104028 KB Output is correct
20 Correct 102 ms 104060 KB Output is correct
21 Correct 112 ms 103800 KB Output is correct
22 Correct 101 ms 104056 KB Output is correct
23 Correct 101 ms 104060 KB Output is correct
24 Correct 102 ms 104056 KB Output is correct
25 Correct 101 ms 104028 KB Output is correct
26 Correct 107 ms 104056 KB Output is correct
27 Correct 102 ms 103932 KB Output is correct
28 Correct 103 ms 103928 KB Output is correct
29 Correct 103 ms 104056 KB Output is correct
30 Correct 103 ms 103928 KB Output is correct
31 Correct 1389 ms 192412 KB Output is correct
32 Correct 230 ms 109668 KB Output is correct
33 Correct 1241 ms 190176 KB Output is correct
34 Correct 1304 ms 189536 KB Output is correct
35 Correct 1435 ms 193216 KB Output is correct
36 Correct 1342 ms 192224 KB Output is correct
37 Correct 933 ms 182128 KB Output is correct
38 Correct 913 ms 179180 KB Output is correct
39 Correct 753 ms 166516 KB Output is correct
40 Correct 740 ms 168928 KB Output is correct
41 Correct 893 ms 160800 KB Output is correct
42 Correct 901 ms 161568 KB Output is correct
43 Correct 195 ms 111552 KB Output is correct
44 Correct 885 ms 159668 KB Output is correct
45 Correct 835 ms 155104 KB Output is correct
46 Correct 787 ms 146656 KB Output is correct
47 Correct 488 ms 140900 KB Output is correct
48 Correct 500 ms 140512 KB Output is correct
49 Correct 654 ms 148248 KB Output is correct
50 Correct 705 ms 155672 KB Output is correct
51 Correct 606 ms 146272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3491 ms 269152 KB Output is correct
2 Correct 4482 ms 307344 KB Output is correct
3 Correct 1710 ms 225792 KB Output is correct
4 Correct 3033 ms 262488 KB Output is correct
5 Correct 3787 ms 278196 KB Output is correct
6 Correct 4369 ms 299944 KB Output is correct
7 Correct 1638 ms 225728 KB Output is correct
8 Correct 2651 ms 260080 KB Output is correct
9 Correct 3353 ms 291244 KB Output is correct
10 Correct 3714 ms 322000 KB Output is correct
11 Correct 2598 ms 313140 KB Output is correct
12 Correct 3163 ms 317760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5103 ms 433036 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 103712 KB Output is correct
2 Correct 101 ms 103644 KB Output is correct
3 Correct 100 ms 103672 KB Output is correct
4 Correct 102 ms 103672 KB Output is correct
5 Correct 101 ms 103748 KB Output is correct
6 Correct 104 ms 104264 KB Output is correct
7 Correct 106 ms 103900 KB Output is correct
8 Correct 104 ms 104056 KB Output is correct
9 Correct 103 ms 103928 KB Output is correct
10 Correct 104 ms 104056 KB Output is correct
11 Correct 102 ms 103928 KB Output is correct
12 Correct 106 ms 103960 KB Output is correct
13 Correct 100 ms 103928 KB Output is correct
14 Correct 109 ms 103928 KB Output is correct
15 Correct 109 ms 104056 KB Output is correct
16 Correct 110 ms 104124 KB Output is correct
17 Correct 107 ms 104056 KB Output is correct
18 Correct 105 ms 104092 KB Output is correct
19 Correct 101 ms 104028 KB Output is correct
20 Correct 102 ms 104060 KB Output is correct
21 Correct 112 ms 103800 KB Output is correct
22 Correct 101 ms 104056 KB Output is correct
23 Correct 101 ms 104060 KB Output is correct
24 Correct 102 ms 104056 KB Output is correct
25 Correct 101 ms 104028 KB Output is correct
26 Correct 107 ms 104056 KB Output is correct
27 Correct 102 ms 103932 KB Output is correct
28 Correct 103 ms 103928 KB Output is correct
29 Correct 103 ms 104056 KB Output is correct
30 Correct 103 ms 103928 KB Output is correct
31 Correct 1389 ms 192412 KB Output is correct
32 Correct 230 ms 109668 KB Output is correct
33 Correct 1241 ms 190176 KB Output is correct
34 Correct 1304 ms 189536 KB Output is correct
35 Correct 1435 ms 193216 KB Output is correct
36 Correct 1342 ms 192224 KB Output is correct
37 Correct 933 ms 182128 KB Output is correct
38 Correct 913 ms 179180 KB Output is correct
39 Correct 753 ms 166516 KB Output is correct
40 Correct 740 ms 168928 KB Output is correct
41 Correct 893 ms 160800 KB Output is correct
42 Correct 901 ms 161568 KB Output is correct
43 Correct 195 ms 111552 KB Output is correct
44 Correct 885 ms 159668 KB Output is correct
45 Correct 835 ms 155104 KB Output is correct
46 Correct 787 ms 146656 KB Output is correct
47 Correct 488 ms 140900 KB Output is correct
48 Correct 500 ms 140512 KB Output is correct
49 Correct 654 ms 148248 KB Output is correct
50 Correct 705 ms 155672 KB Output is correct
51 Correct 606 ms 146272 KB Output is correct
52 Correct 545 ms 141920 KB Output is correct
53 Correct 529 ms 139844 KB Output is correct
54 Correct 933 ms 165216 KB Output is correct
55 Correct 769 ms 158560 KB Output is correct
56 Correct 690 ms 155304 KB Output is correct
57 Correct 861 ms 159628 KB Output is correct
58 Correct 803 ms 156896 KB Output is correct
59 Correct 728 ms 153568 KB Output is correct
60 Correct 876 ms 159968 KB Output is correct
61 Correct 194 ms 111980 KB Output is correct
62 Correct 505 ms 144096 KB Output is correct
63 Correct 794 ms 157780 KB Output is correct
64 Correct 892 ms 163104 KB Output is correct
65 Correct 1070 ms 169408 KB Output is correct
66 Correct 1002 ms 164324 KB Output is correct
67 Correct 240 ms 109444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 103712 KB Output is correct
2 Correct 101 ms 103644 KB Output is correct
3 Correct 100 ms 103672 KB Output is correct
4 Correct 102 ms 103672 KB Output is correct
5 Correct 101 ms 103748 KB Output is correct
6 Correct 104 ms 104264 KB Output is correct
7 Correct 106 ms 103900 KB Output is correct
8 Correct 104 ms 104056 KB Output is correct
9 Correct 103 ms 103928 KB Output is correct
10 Correct 104 ms 104056 KB Output is correct
11 Correct 102 ms 103928 KB Output is correct
12 Correct 106 ms 103960 KB Output is correct
13 Correct 100 ms 103928 KB Output is correct
14 Correct 109 ms 103928 KB Output is correct
15 Correct 109 ms 104056 KB Output is correct
16 Correct 110 ms 104124 KB Output is correct
17 Correct 107 ms 104056 KB Output is correct
18 Correct 105 ms 104092 KB Output is correct
19 Correct 101 ms 104028 KB Output is correct
20 Correct 102 ms 104060 KB Output is correct
21 Correct 112 ms 103800 KB Output is correct
22 Correct 101 ms 104056 KB Output is correct
23 Correct 101 ms 104060 KB Output is correct
24 Correct 102 ms 104056 KB Output is correct
25 Correct 101 ms 104028 KB Output is correct
26 Correct 107 ms 104056 KB Output is correct
27 Correct 102 ms 103932 KB Output is correct
28 Correct 103 ms 103928 KB Output is correct
29 Correct 103 ms 104056 KB Output is correct
30 Correct 103 ms 103928 KB Output is correct
31 Correct 1389 ms 192412 KB Output is correct
32 Correct 230 ms 109668 KB Output is correct
33 Correct 1241 ms 190176 KB Output is correct
34 Correct 1304 ms 189536 KB Output is correct
35 Correct 1435 ms 193216 KB Output is correct
36 Correct 1342 ms 192224 KB Output is correct
37 Correct 933 ms 182128 KB Output is correct
38 Correct 913 ms 179180 KB Output is correct
39 Correct 753 ms 166516 KB Output is correct
40 Correct 740 ms 168928 KB Output is correct
41 Correct 893 ms 160800 KB Output is correct
42 Correct 901 ms 161568 KB Output is correct
43 Correct 195 ms 111552 KB Output is correct
44 Correct 885 ms 159668 KB Output is correct
45 Correct 835 ms 155104 KB Output is correct
46 Correct 787 ms 146656 KB Output is correct
47 Correct 488 ms 140900 KB Output is correct
48 Correct 500 ms 140512 KB Output is correct
49 Correct 654 ms 148248 KB Output is correct
50 Correct 705 ms 155672 KB Output is correct
51 Correct 606 ms 146272 KB Output is correct
52 Correct 3491 ms 269152 KB Output is correct
53 Correct 4482 ms 307344 KB Output is correct
54 Correct 1710 ms 225792 KB Output is correct
55 Correct 3033 ms 262488 KB Output is correct
56 Correct 3787 ms 278196 KB Output is correct
57 Correct 4369 ms 299944 KB Output is correct
58 Correct 1638 ms 225728 KB Output is correct
59 Correct 2651 ms 260080 KB Output is correct
60 Correct 3353 ms 291244 KB Output is correct
61 Correct 3714 ms 322000 KB Output is correct
62 Correct 2598 ms 313140 KB Output is correct
63 Correct 3163 ms 317760 KB Output is correct
64 Execution timed out 5103 ms 433036 KB Time limit exceeded
65 Halted 0 ms 0 KB -