답안 #160948

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
160948 2019-10-30T17:20:15 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
47 / 100
5000 ms 323968 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;
};

const int N = 3e5 + 5, INF = 1e9, MAX = 1e8;
int n, q, k, cc, cq;
int ans[N], loc[N], num[N];

vector<int> vx;
multiset<int> occ[N];
map<pair<int, int>, vector<int>> mp;
vector<pair<int, int>> t[N * 4];

struct ST {
    vector<int> t[N * 4];

    void upd(int l, int r, int x, int v, int L, int R) {
        if (l > r)
            return;
        if (l == L && r == R) {
            t[v].push_back(max(t[v].back(), x));
        }
        else {
            int m = (L + R) >> 1;
            upd(l, min(m, r), x, v * 2, L, m);
            upd(max(m + 1, l), r, x, v * 2 + 1, m + 1, R);
        }
    }

    void del(int l, int r, int v, int L, int R) {
        if (l > r)
            return;
        if (l == L && r == R) {
            t[v].pop_back();
        }
        else {
            int m = (L + R) >> 1;
            del(l, min(m, r), v * 2, L, m);
            del(max(m + 1, l), r, v * 2 + 1, m + 1, R);
        }
    }

    int que(int x, int v, int L, int R, int ans = -INF) {
        ans = max(ans, t[v].back());
        if (L == R)
            return ans;
        int m = (L + R) >> 1;
        if (x <= m)
            return que(x, v * 2, L, m, ans);
        return que(x, v * 2 + 1, m + 1, R, ans);
    }

    void clear() {
        for (int i = 0; i < N * 4; i++) {
            t[i] = {-INF};
        }
    }
} segt;

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) {
    // cout << "!" << x << " " << y << "\n";
    auto p = make_pair(x, y);
    upd(mp[{x, y}].back(), cq - 1, p, 1, 0, q - 1);
    // cout << "SEG_END " << mp[{x, y}].back() << " " << cq - 1 << " " << x << " " << y << "\n";
    mp[{x, y}].pop_back();
}

void updBeg(int x, bool add) {
    // cout << "BEG " << x << " " << add << "\n";
    if (add)
        startSeg(0, x);
    else
        endSeg(0, x);
}

void updBetween(int x, int y, bool add) {
    // cout << "BET " << x << " " << y << " " << add << "\n";
    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) {
    for (auto &p : t[v]) {
        segt.upd(p.first, cc - 1, p.second, 1, 0, cc - 1);
    }

    if (L == R) {
        ans[num[L]] = max(ans[num[L]], segt.que(loc[L], 1, 0, cc - 1) - vx[loc[L]]);
    }
    else {
        int m = (L + R) >> 1;
        calcAns(v * 2, L, m);
        calcAns(v * 2 + 1, m + 1, R);
    }

    for (auto &p : t[v]) {
        segt.del(p.first, cc - 1, 1, 0, cc - 1);
    }
}

void solve(vector<E> evs) {
    vx.clear();
    mp.clear();
    for (int i = 0; i < N; i++) {
        occ[i].clear();
    }

    for (int i = 0; i < N * 4; i++) {
        t[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());

    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);
                }
            }

            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 {
            loc[cq] = lower_bound(all(vx), e.x) - vx.begin();
            num[cq] = e.y;
            cq++;
        }
    }

    segt.clear();
    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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 196 ms 108508 KB Output is correct
2 Correct 165 ms 108544 KB Output is correct
3 Correct 172 ms 108432 KB Output is correct
4 Correct 166 ms 108412 KB Output is correct
5 Correct 174 ms 108484 KB Output is correct
6 Correct 170 ms 108564 KB Output is correct
7 Correct 178 ms 108784 KB Output is correct
8 Correct 200 ms 108648 KB Output is correct
9 Correct 178 ms 108664 KB Output is correct
10 Correct 193 ms 108696 KB Output is correct
11 Correct 170 ms 108808 KB Output is correct
12 Correct 182 ms 108624 KB Output is correct
13 Correct 173 ms 108560 KB Output is correct
14 Correct 169 ms 108460 KB Output is correct
15 Correct 180 ms 108704 KB Output is correct
16 Correct 184 ms 108564 KB Output is correct
17 Correct 199 ms 108560 KB Output is correct
18 Correct 185 ms 108664 KB Output is correct
19 Correct 180 ms 108808 KB Output is correct
20 Correct 171 ms 108540 KB Output is correct
21 Correct 167 ms 108536 KB Output is correct
22 Correct 180 ms 108756 KB Output is correct
23 Correct 180 ms 108664 KB Output is correct
24 Correct 186 ms 108664 KB Output is correct
25 Correct 175 ms 108664 KB Output is correct
26 Correct 172 ms 108536 KB Output is correct
27 Correct 169 ms 108536 KB Output is correct
28 Correct 177 ms 108568 KB Output is correct
29 Correct 176 ms 108520 KB Output is correct
30 Correct 170 ms 108576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 196 ms 108508 KB Output is correct
2 Correct 165 ms 108544 KB Output is correct
3 Correct 172 ms 108432 KB Output is correct
4 Correct 166 ms 108412 KB Output is correct
5 Correct 174 ms 108484 KB Output is correct
6 Correct 170 ms 108564 KB Output is correct
7 Correct 178 ms 108784 KB Output is correct
8 Correct 200 ms 108648 KB Output is correct
9 Correct 178 ms 108664 KB Output is correct
10 Correct 193 ms 108696 KB Output is correct
11 Correct 170 ms 108808 KB Output is correct
12 Correct 182 ms 108624 KB Output is correct
13 Correct 173 ms 108560 KB Output is correct
14 Correct 169 ms 108460 KB Output is correct
15 Correct 180 ms 108704 KB Output is correct
16 Correct 184 ms 108564 KB Output is correct
17 Correct 199 ms 108560 KB Output is correct
18 Correct 185 ms 108664 KB Output is correct
19 Correct 180 ms 108808 KB Output is correct
20 Correct 171 ms 108540 KB Output is correct
21 Correct 167 ms 108536 KB Output is correct
22 Correct 180 ms 108756 KB Output is correct
23 Correct 180 ms 108664 KB Output is correct
24 Correct 186 ms 108664 KB Output is correct
25 Correct 175 ms 108664 KB Output is correct
26 Correct 172 ms 108536 KB Output is correct
27 Correct 169 ms 108536 KB Output is correct
28 Correct 177 ms 108568 KB Output is correct
29 Correct 176 ms 108520 KB Output is correct
30 Correct 170 ms 108576 KB Output is correct
31 Correct 4041 ms 165164 KB Output is correct
32 Correct 368 ms 117376 KB Output is correct
33 Correct 3621 ms 160088 KB Output is correct
34 Correct 3735 ms 161032 KB Output is correct
35 Correct 4267 ms 165444 KB Output is correct
36 Correct 4021 ms 163896 KB Output is correct
37 Correct 2614 ms 156616 KB Output is correct
38 Correct 2269 ms 154444 KB Output is correct
39 Correct 1727 ms 148276 KB Output is correct
40 Correct 1647 ms 149188 KB Output is correct
41 Correct 1717 ms 146080 KB Output is correct
42 Correct 1725 ms 146752 KB Output is correct
43 Correct 284 ms 120692 KB Output is correct
44 Correct 1675 ms 145504 KB Output is correct
45 Correct 1469 ms 143016 KB Output is correct
46 Correct 1202 ms 138348 KB Output is correct
47 Correct 781 ms 136188 KB Output is correct
48 Correct 724 ms 135092 KB Output is correct
49 Correct 922 ms 139472 KB Output is correct
50 Correct 1170 ms 144796 KB Output is correct
51 Correct 927 ms 137968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5097 ms 231400 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5116 ms 323968 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 196 ms 108508 KB Output is correct
2 Correct 165 ms 108544 KB Output is correct
3 Correct 172 ms 108432 KB Output is correct
4 Correct 166 ms 108412 KB Output is correct
5 Correct 174 ms 108484 KB Output is correct
6 Correct 170 ms 108564 KB Output is correct
7 Correct 178 ms 108784 KB Output is correct
8 Correct 200 ms 108648 KB Output is correct
9 Correct 178 ms 108664 KB Output is correct
10 Correct 193 ms 108696 KB Output is correct
11 Correct 170 ms 108808 KB Output is correct
12 Correct 182 ms 108624 KB Output is correct
13 Correct 173 ms 108560 KB Output is correct
14 Correct 169 ms 108460 KB Output is correct
15 Correct 180 ms 108704 KB Output is correct
16 Correct 184 ms 108564 KB Output is correct
17 Correct 199 ms 108560 KB Output is correct
18 Correct 185 ms 108664 KB Output is correct
19 Correct 180 ms 108808 KB Output is correct
20 Correct 171 ms 108540 KB Output is correct
21 Correct 167 ms 108536 KB Output is correct
22 Correct 180 ms 108756 KB Output is correct
23 Correct 180 ms 108664 KB Output is correct
24 Correct 186 ms 108664 KB Output is correct
25 Correct 175 ms 108664 KB Output is correct
26 Correct 172 ms 108536 KB Output is correct
27 Correct 169 ms 108536 KB Output is correct
28 Correct 177 ms 108568 KB Output is correct
29 Correct 176 ms 108520 KB Output is correct
30 Correct 170 ms 108576 KB Output is correct
31 Correct 4041 ms 165164 KB Output is correct
32 Correct 368 ms 117376 KB Output is correct
33 Correct 3621 ms 160088 KB Output is correct
34 Correct 3735 ms 161032 KB Output is correct
35 Correct 4267 ms 165444 KB Output is correct
36 Correct 4021 ms 163896 KB Output is correct
37 Correct 2614 ms 156616 KB Output is correct
38 Correct 2269 ms 154444 KB Output is correct
39 Correct 1727 ms 148276 KB Output is correct
40 Correct 1647 ms 149188 KB Output is correct
41 Correct 1717 ms 146080 KB Output is correct
42 Correct 1725 ms 146752 KB Output is correct
43 Correct 284 ms 120692 KB Output is correct
44 Correct 1675 ms 145504 KB Output is correct
45 Correct 1469 ms 143016 KB Output is correct
46 Correct 1202 ms 138348 KB Output is correct
47 Correct 781 ms 136188 KB Output is correct
48 Correct 724 ms 135092 KB Output is correct
49 Correct 922 ms 139472 KB Output is correct
50 Correct 1170 ms 144796 KB Output is correct
51 Correct 927 ms 137968 KB Output is correct
52 Correct 1081 ms 164372 KB Output is correct
53 Correct 1002 ms 150896 KB Output is correct
54 Correct 2265 ms 159764 KB Output is correct
55 Correct 1448 ms 155036 KB Output is correct
56 Correct 1311 ms 157408 KB Output is correct
57 Correct 1623 ms 148676 KB Output is correct
58 Correct 1544 ms 153020 KB Output is correct
59 Correct 1439 ms 156200 KB Output is correct
60 Correct 1768 ms 148404 KB Output is correct
61 Correct 315 ms 128796 KB Output is correct
62 Correct 1096 ms 165788 KB Output is correct
63 Correct 1765 ms 159944 KB Output is correct
64 Correct 2020 ms 158048 KB Output is correct
65 Correct 2206 ms 154360 KB Output is correct
66 Correct 1799 ms 148184 KB Output is correct
67 Correct 515 ms 126392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 196 ms 108508 KB Output is correct
2 Correct 165 ms 108544 KB Output is correct
3 Correct 172 ms 108432 KB Output is correct
4 Correct 166 ms 108412 KB Output is correct
5 Correct 174 ms 108484 KB Output is correct
6 Correct 170 ms 108564 KB Output is correct
7 Correct 178 ms 108784 KB Output is correct
8 Correct 200 ms 108648 KB Output is correct
9 Correct 178 ms 108664 KB Output is correct
10 Correct 193 ms 108696 KB Output is correct
11 Correct 170 ms 108808 KB Output is correct
12 Correct 182 ms 108624 KB Output is correct
13 Correct 173 ms 108560 KB Output is correct
14 Correct 169 ms 108460 KB Output is correct
15 Correct 180 ms 108704 KB Output is correct
16 Correct 184 ms 108564 KB Output is correct
17 Correct 199 ms 108560 KB Output is correct
18 Correct 185 ms 108664 KB Output is correct
19 Correct 180 ms 108808 KB Output is correct
20 Correct 171 ms 108540 KB Output is correct
21 Correct 167 ms 108536 KB Output is correct
22 Correct 180 ms 108756 KB Output is correct
23 Correct 180 ms 108664 KB Output is correct
24 Correct 186 ms 108664 KB Output is correct
25 Correct 175 ms 108664 KB Output is correct
26 Correct 172 ms 108536 KB Output is correct
27 Correct 169 ms 108536 KB Output is correct
28 Correct 177 ms 108568 KB Output is correct
29 Correct 176 ms 108520 KB Output is correct
30 Correct 170 ms 108576 KB Output is correct
31 Correct 4041 ms 165164 KB Output is correct
32 Correct 368 ms 117376 KB Output is correct
33 Correct 3621 ms 160088 KB Output is correct
34 Correct 3735 ms 161032 KB Output is correct
35 Correct 4267 ms 165444 KB Output is correct
36 Correct 4021 ms 163896 KB Output is correct
37 Correct 2614 ms 156616 KB Output is correct
38 Correct 2269 ms 154444 KB Output is correct
39 Correct 1727 ms 148276 KB Output is correct
40 Correct 1647 ms 149188 KB Output is correct
41 Correct 1717 ms 146080 KB Output is correct
42 Correct 1725 ms 146752 KB Output is correct
43 Correct 284 ms 120692 KB Output is correct
44 Correct 1675 ms 145504 KB Output is correct
45 Correct 1469 ms 143016 KB Output is correct
46 Correct 1202 ms 138348 KB Output is correct
47 Correct 781 ms 136188 KB Output is correct
48 Correct 724 ms 135092 KB Output is correct
49 Correct 922 ms 139472 KB Output is correct
50 Correct 1170 ms 144796 KB Output is correct
51 Correct 927 ms 137968 KB Output is correct
52 Execution timed out 5097 ms 231400 KB Time limit exceeded
53 Halted 0 ms 0 KB -