답안 #161017

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
161017 2019-10-31T08:17:57 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
57 / 100
5000 ms 380228 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];
 
vector<int> vx;
multiset<int> occ[N];
vector<pair<int, int>> t[N * 4];
vector<U> updates[2];
 
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 type, int x, int y) {
    mp[type][x][y].push_back(cq);
}
 
void endSeg(int type, int x, int y) {
    updates[type].push_back({mp[type][x][y].back(), cq - 1, {x, y}});
    mp[type][x][y].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) {
        int m = (L + R) >> 1;
        calcAns(v * 2, L, m);
        calcAns(v * 2 + 1, m + 1, R);

        sort(lt + L, lt + R + 1);
        
        // 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 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;
 
    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);
            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);
                }
                if (it == occ[e.y].end()) {
                    updEnd(*prev(it), false);
                }
            }
 
            it = occ[e.y].insert(e.x);
 
            if (it == occ[e.y].begin()) 
                updBeg(e.x, true);
            else
                updBetween(*prev(it), e.x, true);
 
            if (next(it) != occ[e.y].end())
                updBetween(e.x, *next(it), 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);
        }
        else {
            cq++;
        }
    }

    for (int i = 0; i < 2; i++) {
        sort(all(updates[i]), [](const U &a, const U &b) {
            return a.p.first < b.p.first;
        });
    }
}

void solve(vector<U> updates, vector<E> evs) {
    for (int i = 0; i < N * 4; i++)
        t[i].clear();

    cq = 0;

    for (E &e : evs) {
        if (e.t == 2) {
            lt[cq++] = {lower_bound(all(vx), e.x) - vx.begin(), e.y};
        }
    }

    for (U u : updates) {
        // cout << u.l << " " << u.r << " " << u.p.first << " " << u.p.second << "\n";
        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});
    }
 
    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;
    });

    calcUpdates(evs);
    solve(updates[0], evs);

    for (E &e : evs)
        e.x = INF - e.x;
    for (int &x : vx)
        x = INF - x;
    reverse(all(vx));

    solve(updates[1], 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:106: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 83 ms 75512 KB Output is correct
2 Correct 84 ms 75512 KB Output is correct
3 Correct 86 ms 75512 KB Output is correct
4 Correct 82 ms 75676 KB Output is correct
5 Correct 82 ms 75744 KB Output is correct
6 Correct 89 ms 75896 KB Output is correct
7 Correct 85 ms 75768 KB Output is correct
8 Correct 105 ms 75896 KB Output is correct
9 Correct 96 ms 75832 KB Output is correct
10 Correct 88 ms 75908 KB Output is correct
11 Correct 82 ms 75896 KB Output is correct
12 Correct 85 ms 75896 KB Output is correct
13 Correct 90 ms 75752 KB Output is correct
14 Correct 83 ms 75768 KB Output is correct
15 Correct 84 ms 75832 KB Output is correct
16 Correct 92 ms 75896 KB Output is correct
17 Correct 87 ms 75896 KB Output is correct
18 Correct 84 ms 75896 KB Output is correct
19 Correct 94 ms 75896 KB Output is correct
20 Correct 88 ms 75896 KB Output is correct
21 Correct 91 ms 75768 KB Output is correct
22 Correct 85 ms 75896 KB Output is correct
23 Correct 84 ms 75896 KB Output is correct
24 Correct 93 ms 75896 KB Output is correct
25 Correct 84 ms 75896 KB Output is correct
26 Correct 95 ms 75896 KB Output is correct
27 Correct 90 ms 75768 KB Output is correct
28 Correct 86 ms 75768 KB Output is correct
29 Correct 82 ms 75768 KB Output is correct
30 Correct 93 ms 75640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 75512 KB Output is correct
2 Correct 84 ms 75512 KB Output is correct
3 Correct 86 ms 75512 KB Output is correct
4 Correct 82 ms 75676 KB Output is correct
5 Correct 82 ms 75744 KB Output is correct
6 Correct 89 ms 75896 KB Output is correct
7 Correct 85 ms 75768 KB Output is correct
8 Correct 105 ms 75896 KB Output is correct
9 Correct 96 ms 75832 KB Output is correct
10 Correct 88 ms 75908 KB Output is correct
11 Correct 82 ms 75896 KB Output is correct
12 Correct 85 ms 75896 KB Output is correct
13 Correct 90 ms 75752 KB Output is correct
14 Correct 83 ms 75768 KB Output is correct
15 Correct 84 ms 75832 KB Output is correct
16 Correct 92 ms 75896 KB Output is correct
17 Correct 87 ms 75896 KB Output is correct
18 Correct 84 ms 75896 KB Output is correct
19 Correct 94 ms 75896 KB Output is correct
20 Correct 88 ms 75896 KB Output is correct
21 Correct 91 ms 75768 KB Output is correct
22 Correct 85 ms 75896 KB Output is correct
23 Correct 84 ms 75896 KB Output is correct
24 Correct 93 ms 75896 KB Output is correct
25 Correct 84 ms 75896 KB Output is correct
26 Correct 95 ms 75896 KB Output is correct
27 Correct 90 ms 75768 KB Output is correct
28 Correct 86 ms 75768 KB Output is correct
29 Correct 82 ms 75768 KB Output is correct
30 Correct 93 ms 75640 KB Output is correct
31 Correct 1443 ms 148920 KB Output is correct
32 Correct 348 ms 90336 KB Output is correct
33 Correct 1276 ms 146900 KB Output is correct
34 Correct 1242 ms 147028 KB Output is correct
35 Correct 1437 ms 149340 KB Output is correct
36 Correct 1259 ms 148072 KB Output is correct
37 Correct 880 ms 142956 KB Output is correct
38 Correct 857 ms 140064 KB Output is correct
39 Correct 691 ms 134104 KB Output is correct
40 Correct 709 ms 134664 KB Output is correct
41 Correct 897 ms 129888 KB Output is correct
42 Correct 902 ms 130188 KB Output is correct
43 Correct 253 ms 91852 KB Output is correct
44 Correct 925 ms 129404 KB Output is correct
45 Correct 892 ms 127120 KB Output is correct
46 Correct 785 ms 122588 KB Output is correct
47 Correct 521 ms 118324 KB Output is correct
48 Correct 509 ms 117876 KB Output is correct
49 Correct 628 ms 122772 KB Output is correct
50 Correct 704 ms 127352 KB Output is correct
51 Correct 635 ms 121728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4231 ms 284532 KB Output is correct
2 Correct 4751 ms 305372 KB Output is correct
3 Correct 2917 ms 322980 KB Output is correct
4 Correct 4035 ms 269152 KB Output is correct
5 Correct 4715 ms 278876 KB Output is correct
6 Correct 4806 ms 304032 KB Output is correct
7 Correct 2807 ms 320096 KB Output is correct
8 Correct 3586 ms 279048 KB Output is correct
9 Correct 4225 ms 284432 KB Output is correct
10 Correct 4245 ms 318300 KB Output is correct
11 Correct 2825 ms 308568 KB Output is correct
12 Correct 3562 ms 313636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5047 ms 380228 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 75512 KB Output is correct
2 Correct 84 ms 75512 KB Output is correct
3 Correct 86 ms 75512 KB Output is correct
4 Correct 82 ms 75676 KB Output is correct
5 Correct 82 ms 75744 KB Output is correct
6 Correct 89 ms 75896 KB Output is correct
7 Correct 85 ms 75768 KB Output is correct
8 Correct 105 ms 75896 KB Output is correct
9 Correct 96 ms 75832 KB Output is correct
10 Correct 88 ms 75908 KB Output is correct
11 Correct 82 ms 75896 KB Output is correct
12 Correct 85 ms 75896 KB Output is correct
13 Correct 90 ms 75752 KB Output is correct
14 Correct 83 ms 75768 KB Output is correct
15 Correct 84 ms 75832 KB Output is correct
16 Correct 92 ms 75896 KB Output is correct
17 Correct 87 ms 75896 KB Output is correct
18 Correct 84 ms 75896 KB Output is correct
19 Correct 94 ms 75896 KB Output is correct
20 Correct 88 ms 75896 KB Output is correct
21 Correct 91 ms 75768 KB Output is correct
22 Correct 85 ms 75896 KB Output is correct
23 Correct 84 ms 75896 KB Output is correct
24 Correct 93 ms 75896 KB Output is correct
25 Correct 84 ms 75896 KB Output is correct
26 Correct 95 ms 75896 KB Output is correct
27 Correct 90 ms 75768 KB Output is correct
28 Correct 86 ms 75768 KB Output is correct
29 Correct 82 ms 75768 KB Output is correct
30 Correct 93 ms 75640 KB Output is correct
31 Correct 1443 ms 148920 KB Output is correct
32 Correct 348 ms 90336 KB Output is correct
33 Correct 1276 ms 146900 KB Output is correct
34 Correct 1242 ms 147028 KB Output is correct
35 Correct 1437 ms 149340 KB Output is correct
36 Correct 1259 ms 148072 KB Output is correct
37 Correct 880 ms 142956 KB Output is correct
38 Correct 857 ms 140064 KB Output is correct
39 Correct 691 ms 134104 KB Output is correct
40 Correct 709 ms 134664 KB Output is correct
41 Correct 897 ms 129888 KB Output is correct
42 Correct 902 ms 130188 KB Output is correct
43 Correct 253 ms 91852 KB Output is correct
44 Correct 925 ms 129404 KB Output is correct
45 Correct 892 ms 127120 KB Output is correct
46 Correct 785 ms 122588 KB Output is correct
47 Correct 521 ms 118324 KB Output is correct
48 Correct 509 ms 117876 KB Output is correct
49 Correct 628 ms 122772 KB Output is correct
50 Correct 704 ms 127352 KB Output is correct
51 Correct 635 ms 121728 KB Output is correct
52 Correct 769 ms 138532 KB Output is correct
53 Correct 703 ms 126564 KB Output is correct
54 Correct 1064 ms 136680 KB Output is correct
55 Correct 896 ms 134360 KB Output is correct
56 Correct 871 ms 135244 KB Output is correct
57 Correct 963 ms 129812 KB Output is correct
58 Correct 904 ms 133384 KB Output is correct
59 Correct 914 ms 134844 KB Output is correct
60 Correct 963 ms 130072 KB Output is correct
61 Correct 331 ms 107584 KB Output is correct
62 Correct 813 ms 140460 KB Output is correct
63 Correct 976 ms 136544 KB Output is correct
64 Correct 1025 ms 136000 KB Output is correct
65 Correct 1060 ms 134924 KB Output is correct
66 Correct 963 ms 130576 KB Output is correct
67 Correct 405 ms 101560 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 75512 KB Output is correct
2 Correct 84 ms 75512 KB Output is correct
3 Correct 86 ms 75512 KB Output is correct
4 Correct 82 ms 75676 KB Output is correct
5 Correct 82 ms 75744 KB Output is correct
6 Correct 89 ms 75896 KB Output is correct
7 Correct 85 ms 75768 KB Output is correct
8 Correct 105 ms 75896 KB Output is correct
9 Correct 96 ms 75832 KB Output is correct
10 Correct 88 ms 75908 KB Output is correct
11 Correct 82 ms 75896 KB Output is correct
12 Correct 85 ms 75896 KB Output is correct
13 Correct 90 ms 75752 KB Output is correct
14 Correct 83 ms 75768 KB Output is correct
15 Correct 84 ms 75832 KB Output is correct
16 Correct 92 ms 75896 KB Output is correct
17 Correct 87 ms 75896 KB Output is correct
18 Correct 84 ms 75896 KB Output is correct
19 Correct 94 ms 75896 KB Output is correct
20 Correct 88 ms 75896 KB Output is correct
21 Correct 91 ms 75768 KB Output is correct
22 Correct 85 ms 75896 KB Output is correct
23 Correct 84 ms 75896 KB Output is correct
24 Correct 93 ms 75896 KB Output is correct
25 Correct 84 ms 75896 KB Output is correct
26 Correct 95 ms 75896 KB Output is correct
27 Correct 90 ms 75768 KB Output is correct
28 Correct 86 ms 75768 KB Output is correct
29 Correct 82 ms 75768 KB Output is correct
30 Correct 93 ms 75640 KB Output is correct
31 Correct 1443 ms 148920 KB Output is correct
32 Correct 348 ms 90336 KB Output is correct
33 Correct 1276 ms 146900 KB Output is correct
34 Correct 1242 ms 147028 KB Output is correct
35 Correct 1437 ms 149340 KB Output is correct
36 Correct 1259 ms 148072 KB Output is correct
37 Correct 880 ms 142956 KB Output is correct
38 Correct 857 ms 140064 KB Output is correct
39 Correct 691 ms 134104 KB Output is correct
40 Correct 709 ms 134664 KB Output is correct
41 Correct 897 ms 129888 KB Output is correct
42 Correct 902 ms 130188 KB Output is correct
43 Correct 253 ms 91852 KB Output is correct
44 Correct 925 ms 129404 KB Output is correct
45 Correct 892 ms 127120 KB Output is correct
46 Correct 785 ms 122588 KB Output is correct
47 Correct 521 ms 118324 KB Output is correct
48 Correct 509 ms 117876 KB Output is correct
49 Correct 628 ms 122772 KB Output is correct
50 Correct 704 ms 127352 KB Output is correct
51 Correct 635 ms 121728 KB Output is correct
52 Correct 4231 ms 284532 KB Output is correct
53 Correct 4751 ms 305372 KB Output is correct
54 Correct 2917 ms 322980 KB Output is correct
55 Correct 4035 ms 269152 KB Output is correct
56 Correct 4715 ms 278876 KB Output is correct
57 Correct 4806 ms 304032 KB Output is correct
58 Correct 2807 ms 320096 KB Output is correct
59 Correct 3586 ms 279048 KB Output is correct
60 Correct 4225 ms 284432 KB Output is correct
61 Correct 4245 ms 318300 KB Output is correct
62 Correct 2825 ms 308568 KB Output is correct
63 Correct 3562 ms 313636 KB Output is correct
64 Execution timed out 5047 ms 380228 KB Time limit exceeded
65 Halted 0 ms 0 KB -