답안 #161025

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
161025 2019-10-31T08:53:09 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
57 / 100
5000 ms 438784 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[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;
 
    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);
                }
            }
 
            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);
        }
        else {
            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 < 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);
 
    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 (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:109: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:133: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 112 ms 103672 KB Output is correct
2 Correct 108 ms 103672 KB Output is correct
3 Correct 99 ms 103672 KB Output is correct
4 Correct 105 ms 103800 KB Output is correct
5 Correct 106 ms 103800 KB Output is correct
6 Correct 113 ms 104312 KB Output is correct
7 Correct 107 ms 103928 KB Output is correct
8 Correct 112 ms 104184 KB Output is correct
9 Correct 105 ms 103928 KB Output is correct
10 Correct 113 ms 104132 KB Output is correct
11 Correct 112 ms 103888 KB Output is correct
12 Correct 101 ms 104056 KB Output is correct
13 Correct 100 ms 103820 KB Output is correct
14 Correct 102 ms 103928 KB Output is correct
15 Correct 107 ms 103976 KB Output is correct
16 Correct 108 ms 104056 KB Output is correct
17 Correct 111 ms 104140 KB Output is correct
18 Correct 112 ms 104056 KB Output is correct
19 Correct 114 ms 104004 KB Output is correct
20 Correct 114 ms 104056 KB Output is correct
21 Correct 113 ms 103800 KB Output is correct
22 Correct 113 ms 103928 KB Output is correct
23 Correct 113 ms 104180 KB Output is correct
24 Correct 115 ms 104060 KB Output is correct
25 Correct 114 ms 104056 KB Output is correct
26 Correct 113 ms 104040 KB Output is correct
27 Correct 112 ms 103928 KB Output is correct
28 Correct 114 ms 103928 KB Output is correct
29 Correct 113 ms 103996 KB Output is correct
30 Correct 112 ms 103928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 103672 KB Output is correct
2 Correct 108 ms 103672 KB Output is correct
3 Correct 99 ms 103672 KB Output is correct
4 Correct 105 ms 103800 KB Output is correct
5 Correct 106 ms 103800 KB Output is correct
6 Correct 113 ms 104312 KB Output is correct
7 Correct 107 ms 103928 KB Output is correct
8 Correct 112 ms 104184 KB Output is correct
9 Correct 105 ms 103928 KB Output is correct
10 Correct 113 ms 104132 KB Output is correct
11 Correct 112 ms 103888 KB Output is correct
12 Correct 101 ms 104056 KB Output is correct
13 Correct 100 ms 103820 KB Output is correct
14 Correct 102 ms 103928 KB Output is correct
15 Correct 107 ms 103976 KB Output is correct
16 Correct 108 ms 104056 KB Output is correct
17 Correct 111 ms 104140 KB Output is correct
18 Correct 112 ms 104056 KB Output is correct
19 Correct 114 ms 104004 KB Output is correct
20 Correct 114 ms 104056 KB Output is correct
21 Correct 113 ms 103800 KB Output is correct
22 Correct 113 ms 103928 KB Output is correct
23 Correct 113 ms 104180 KB Output is correct
24 Correct 115 ms 104060 KB Output is correct
25 Correct 114 ms 104056 KB Output is correct
26 Correct 113 ms 104040 KB Output is correct
27 Correct 112 ms 103928 KB Output is correct
28 Correct 114 ms 103928 KB Output is correct
29 Correct 113 ms 103996 KB Output is correct
30 Correct 112 ms 103928 KB Output is correct
31 Correct 1350 ms 194696 KB Output is correct
32 Correct 237 ms 110460 KB Output is correct
33 Correct 1484 ms 192496 KB Output is correct
34 Correct 1315 ms 191716 KB Output is correct
35 Correct 1492 ms 195476 KB Output is correct
36 Correct 1343 ms 194408 KB Output is correct
37 Correct 913 ms 184800 KB Output is correct
38 Correct 895 ms 181728 KB Output is correct
39 Correct 715 ms 169048 KB Output is correct
40 Correct 758 ms 171412 KB Output is correct
41 Correct 949 ms 163296 KB Output is correct
42 Correct 904 ms 164000 KB Output is correct
43 Correct 198 ms 113384 KB Output is correct
44 Correct 915 ms 162236 KB Output is correct
45 Correct 869 ms 157540 KB Output is correct
46 Correct 756 ms 149188 KB Output is correct
47 Correct 501 ms 143456 KB Output is correct
48 Correct 526 ms 142944 KB Output is correct
49 Correct 599 ms 150324 KB Output is correct
50 Correct 654 ms 158108 KB Output is correct
51 Correct 598 ms 148448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3638 ms 276888 KB Output is correct
2 Correct 4319 ms 309568 KB Output is correct
3 Correct 2359 ms 259992 KB Output is correct
4 Correct 3167 ms 275556 KB Output is correct
5 Correct 4078 ms 282844 KB Output is correct
6 Correct 4166 ms 308056 KB Output is correct
7 Correct 2253 ms 260144 KB Output is correct
8 Correct 2938 ms 272656 KB Output is correct
9 Correct 3465 ms 286388 KB Output is correct
10 Correct 3668 ms 322276 KB Output is correct
11 Correct 2676 ms 312812 KB Output is correct
12 Correct 3101 ms 317932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5123 ms 438784 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 103672 KB Output is correct
2 Correct 108 ms 103672 KB Output is correct
3 Correct 99 ms 103672 KB Output is correct
4 Correct 105 ms 103800 KB Output is correct
5 Correct 106 ms 103800 KB Output is correct
6 Correct 113 ms 104312 KB Output is correct
7 Correct 107 ms 103928 KB Output is correct
8 Correct 112 ms 104184 KB Output is correct
9 Correct 105 ms 103928 KB Output is correct
10 Correct 113 ms 104132 KB Output is correct
11 Correct 112 ms 103888 KB Output is correct
12 Correct 101 ms 104056 KB Output is correct
13 Correct 100 ms 103820 KB Output is correct
14 Correct 102 ms 103928 KB Output is correct
15 Correct 107 ms 103976 KB Output is correct
16 Correct 108 ms 104056 KB Output is correct
17 Correct 111 ms 104140 KB Output is correct
18 Correct 112 ms 104056 KB Output is correct
19 Correct 114 ms 104004 KB Output is correct
20 Correct 114 ms 104056 KB Output is correct
21 Correct 113 ms 103800 KB Output is correct
22 Correct 113 ms 103928 KB Output is correct
23 Correct 113 ms 104180 KB Output is correct
24 Correct 115 ms 104060 KB Output is correct
25 Correct 114 ms 104056 KB Output is correct
26 Correct 113 ms 104040 KB Output is correct
27 Correct 112 ms 103928 KB Output is correct
28 Correct 114 ms 103928 KB Output is correct
29 Correct 113 ms 103996 KB Output is correct
30 Correct 112 ms 103928 KB Output is correct
31 Correct 1350 ms 194696 KB Output is correct
32 Correct 237 ms 110460 KB Output is correct
33 Correct 1484 ms 192496 KB Output is correct
34 Correct 1315 ms 191716 KB Output is correct
35 Correct 1492 ms 195476 KB Output is correct
36 Correct 1343 ms 194408 KB Output is correct
37 Correct 913 ms 184800 KB Output is correct
38 Correct 895 ms 181728 KB Output is correct
39 Correct 715 ms 169048 KB Output is correct
40 Correct 758 ms 171412 KB Output is correct
41 Correct 949 ms 163296 KB Output is correct
42 Correct 904 ms 164000 KB Output is correct
43 Correct 198 ms 113384 KB Output is correct
44 Correct 915 ms 162236 KB Output is correct
45 Correct 869 ms 157540 KB Output is correct
46 Correct 756 ms 149188 KB Output is correct
47 Correct 501 ms 143456 KB Output is correct
48 Correct 526 ms 142944 KB Output is correct
49 Correct 599 ms 150324 KB Output is correct
50 Correct 654 ms 158108 KB Output is correct
51 Correct 598 ms 148448 KB Output is correct
52 Correct 603 ms 144696 KB Output is correct
53 Correct 580 ms 142420 KB Output is correct
54 Correct 1012 ms 166192 KB Output is correct
55 Correct 814 ms 159456 KB Output is correct
56 Correct 735 ms 156628 KB Output is correct
57 Correct 954 ms 159968 KB Output is correct
58 Correct 904 ms 157924 KB Output is correct
59 Correct 757 ms 154976 KB Output is correct
60 Correct 914 ms 160396 KB Output is correct
61 Correct 245 ms 117328 KB Output is correct
62 Correct 598 ms 146876 KB Output is correct
63 Correct 814 ms 159204 KB Output is correct
64 Correct 938 ms 164144 KB Output is correct
65 Correct 983 ms 169852 KB Output is correct
66 Correct 904 ms 164312 KB Output is correct
67 Correct 234 ms 110044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 103672 KB Output is correct
2 Correct 108 ms 103672 KB Output is correct
3 Correct 99 ms 103672 KB Output is correct
4 Correct 105 ms 103800 KB Output is correct
5 Correct 106 ms 103800 KB Output is correct
6 Correct 113 ms 104312 KB Output is correct
7 Correct 107 ms 103928 KB Output is correct
8 Correct 112 ms 104184 KB Output is correct
9 Correct 105 ms 103928 KB Output is correct
10 Correct 113 ms 104132 KB Output is correct
11 Correct 112 ms 103888 KB Output is correct
12 Correct 101 ms 104056 KB Output is correct
13 Correct 100 ms 103820 KB Output is correct
14 Correct 102 ms 103928 KB Output is correct
15 Correct 107 ms 103976 KB Output is correct
16 Correct 108 ms 104056 KB Output is correct
17 Correct 111 ms 104140 KB Output is correct
18 Correct 112 ms 104056 KB Output is correct
19 Correct 114 ms 104004 KB Output is correct
20 Correct 114 ms 104056 KB Output is correct
21 Correct 113 ms 103800 KB Output is correct
22 Correct 113 ms 103928 KB Output is correct
23 Correct 113 ms 104180 KB Output is correct
24 Correct 115 ms 104060 KB Output is correct
25 Correct 114 ms 104056 KB Output is correct
26 Correct 113 ms 104040 KB Output is correct
27 Correct 112 ms 103928 KB Output is correct
28 Correct 114 ms 103928 KB Output is correct
29 Correct 113 ms 103996 KB Output is correct
30 Correct 112 ms 103928 KB Output is correct
31 Correct 1350 ms 194696 KB Output is correct
32 Correct 237 ms 110460 KB Output is correct
33 Correct 1484 ms 192496 KB Output is correct
34 Correct 1315 ms 191716 KB Output is correct
35 Correct 1492 ms 195476 KB Output is correct
36 Correct 1343 ms 194408 KB Output is correct
37 Correct 913 ms 184800 KB Output is correct
38 Correct 895 ms 181728 KB Output is correct
39 Correct 715 ms 169048 KB Output is correct
40 Correct 758 ms 171412 KB Output is correct
41 Correct 949 ms 163296 KB Output is correct
42 Correct 904 ms 164000 KB Output is correct
43 Correct 198 ms 113384 KB Output is correct
44 Correct 915 ms 162236 KB Output is correct
45 Correct 869 ms 157540 KB Output is correct
46 Correct 756 ms 149188 KB Output is correct
47 Correct 501 ms 143456 KB Output is correct
48 Correct 526 ms 142944 KB Output is correct
49 Correct 599 ms 150324 KB Output is correct
50 Correct 654 ms 158108 KB Output is correct
51 Correct 598 ms 148448 KB Output is correct
52 Correct 3638 ms 276888 KB Output is correct
53 Correct 4319 ms 309568 KB Output is correct
54 Correct 2359 ms 259992 KB Output is correct
55 Correct 3167 ms 275556 KB Output is correct
56 Correct 4078 ms 282844 KB Output is correct
57 Correct 4166 ms 308056 KB Output is correct
58 Correct 2253 ms 260144 KB Output is correct
59 Correct 2938 ms 272656 KB Output is correct
60 Correct 3465 ms 286388 KB Output is correct
61 Correct 3668 ms 322276 KB Output is correct
62 Correct 2676 ms 312812 KB Output is correct
63 Correct 3101 ms 317932 KB Output is correct
64 Execution timed out 5123 ms 438784 KB Time limit exceeded
65 Halted 0 ms 0 KB -