답안 #160951

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
160951 2019-10-30T19:00:24 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
47 / 100
5000 ms 317960 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, 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], t2[N * 4];
vector<U> updates;
 
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) {
    auto p = make_pair(x, y);
    updates.push_back({mp[p].back(), cq - 1, p});
    mp[p].pop_back();
}
 
void updBeg(int x, bool add) {
    if (add)
        startSeg(0, x);
    else
        endSeg(0, x);
}
 
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);
    else
        endSeg(m1, y);  
}
 
void calcAns(int v, int L, int R) {
    if (L == R) {
        t2[v] = {{loc[L], num[L]}};
    }
    else {
        int m = (L + R) >> 1;
        calcAns(v * 2, L, m);
        calcAns(v * 2 + 1, m + 1, R);
        merge(all(t2[v * 2]), all(t2[v * 2 + 1]), back_inserter(t2[v]));
    }

    int i = 0, mx = -INF;
    for (auto &p : t2[v]) {
        while (i < t[v].size() && t[v][i].first <= p.first) {
            mx = max(mx, t[v][i].second);
            i++;
        }
        ans[p.second] = max(ans[p.second], mx - vx[p.first]);
    }
}
 
void solve(vector<E> evs) {
    vx.clear();
    mp.clear();
    updates.clear();


    for (int i = 0; i < N; i++) {
        occ[i].clear();
    }
 
    for (int i = 0; i < N * 4; i++) {
        t[i].clear();
        t2[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());

    cq = 0;
 
    for (E e : evs) {
        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++;
        }
    }

    sort(all(updates), [](const U &a, const U &b) {
        return a.p.first < b.p.first;
    });

    for (U u : updates) {
        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});
        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;
}

Compilation message

new_home.cpp: In function 'void calcAns(int, int, int)':
new_home.cpp:84:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i < t[v].size() && t[v][i].first <= p.first) {
                ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 70904 KB Output is correct
2 Correct 89 ms 70776 KB Output is correct
3 Correct 89 ms 70884 KB Output is correct
4 Correct 87 ms 70748 KB Output is correct
5 Correct 89 ms 70904 KB Output is correct
6 Correct 169 ms 71032 KB Output is correct
7 Correct 89 ms 71032 KB Output is correct
8 Correct 94 ms 71232 KB Output is correct
9 Correct 90 ms 71160 KB Output is correct
10 Correct 91 ms 71160 KB Output is correct
11 Correct 91 ms 71024 KB Output is correct
12 Correct 90 ms 71112 KB Output is correct
13 Correct 92 ms 71004 KB Output is correct
14 Correct 90 ms 71156 KB Output is correct
15 Correct 90 ms 71160 KB Output is correct
16 Correct 90 ms 71160 KB Output is correct
17 Correct 101 ms 71032 KB Output is correct
18 Correct 97 ms 71132 KB Output is correct
19 Correct 101 ms 71140 KB Output is correct
20 Correct 95 ms 71132 KB Output is correct
21 Correct 97 ms 71032 KB Output is correct
22 Correct 94 ms 71152 KB Output is correct
23 Correct 101 ms 71160 KB Output is correct
24 Correct 100 ms 71132 KB Output is correct
25 Correct 92 ms 71032 KB Output is correct
26 Correct 92 ms 71032 KB Output is correct
27 Correct 95 ms 71032 KB Output is correct
28 Correct 94 ms 71156 KB Output is correct
29 Correct 90 ms 71032 KB Output is correct
30 Correct 148 ms 70904 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 70904 KB Output is correct
2 Correct 89 ms 70776 KB Output is correct
3 Correct 89 ms 70884 KB Output is correct
4 Correct 87 ms 70748 KB Output is correct
5 Correct 89 ms 70904 KB Output is correct
6 Correct 169 ms 71032 KB Output is correct
7 Correct 89 ms 71032 KB Output is correct
8 Correct 94 ms 71232 KB Output is correct
9 Correct 90 ms 71160 KB Output is correct
10 Correct 91 ms 71160 KB Output is correct
11 Correct 91 ms 71024 KB Output is correct
12 Correct 90 ms 71112 KB Output is correct
13 Correct 92 ms 71004 KB Output is correct
14 Correct 90 ms 71156 KB Output is correct
15 Correct 90 ms 71160 KB Output is correct
16 Correct 90 ms 71160 KB Output is correct
17 Correct 101 ms 71032 KB Output is correct
18 Correct 97 ms 71132 KB Output is correct
19 Correct 101 ms 71140 KB Output is correct
20 Correct 95 ms 71132 KB Output is correct
21 Correct 97 ms 71032 KB Output is correct
22 Correct 94 ms 71152 KB Output is correct
23 Correct 101 ms 71160 KB Output is correct
24 Correct 100 ms 71132 KB Output is correct
25 Correct 92 ms 71032 KB Output is correct
26 Correct 92 ms 71032 KB Output is correct
27 Correct 95 ms 71032 KB Output is correct
28 Correct 94 ms 71156 KB Output is correct
29 Correct 90 ms 71032 KB Output is correct
30 Correct 148 ms 70904 KB Output is correct
31 Correct 1855 ms 135512 KB Output is correct
32 Correct 334 ms 91592 KB Output is correct
33 Correct 1669 ms 132548 KB Output is correct
34 Correct 1727 ms 133048 KB Output is correct
35 Correct 1864 ms 135680 KB Output is correct
36 Correct 1772 ms 134328 KB Output is correct
37 Correct 1179 ms 128632 KB Output is correct
38 Correct 1138 ms 126684 KB Output is correct
39 Correct 881 ms 120708 KB Output is correct
40 Correct 950 ms 121720 KB Output is correct
41 Correct 1106 ms 119124 KB Output is correct
42 Correct 1382 ms 119384 KB Output is correct
43 Correct 246 ms 93180 KB Output is correct
44 Correct 1113 ms 118516 KB Output is correct
45 Correct 1062 ms 116076 KB Output is correct
46 Correct 965 ms 111588 KB Output is correct
47 Correct 576 ms 109312 KB Output is correct
48 Correct 564 ms 108352 KB Output is correct
49 Correct 690 ms 112476 KB Output is correct
50 Correct 772 ms 117360 KB Output is correct
51 Correct 705 ms 111168 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5118 ms 270688 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5032 ms 317960 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 70904 KB Output is correct
2 Correct 89 ms 70776 KB Output is correct
3 Correct 89 ms 70884 KB Output is correct
4 Correct 87 ms 70748 KB Output is correct
5 Correct 89 ms 70904 KB Output is correct
6 Correct 169 ms 71032 KB Output is correct
7 Correct 89 ms 71032 KB Output is correct
8 Correct 94 ms 71232 KB Output is correct
9 Correct 90 ms 71160 KB Output is correct
10 Correct 91 ms 71160 KB Output is correct
11 Correct 91 ms 71024 KB Output is correct
12 Correct 90 ms 71112 KB Output is correct
13 Correct 92 ms 71004 KB Output is correct
14 Correct 90 ms 71156 KB Output is correct
15 Correct 90 ms 71160 KB Output is correct
16 Correct 90 ms 71160 KB Output is correct
17 Correct 101 ms 71032 KB Output is correct
18 Correct 97 ms 71132 KB Output is correct
19 Correct 101 ms 71140 KB Output is correct
20 Correct 95 ms 71132 KB Output is correct
21 Correct 97 ms 71032 KB Output is correct
22 Correct 94 ms 71152 KB Output is correct
23 Correct 101 ms 71160 KB Output is correct
24 Correct 100 ms 71132 KB Output is correct
25 Correct 92 ms 71032 KB Output is correct
26 Correct 92 ms 71032 KB Output is correct
27 Correct 95 ms 71032 KB Output is correct
28 Correct 94 ms 71156 KB Output is correct
29 Correct 90 ms 71032 KB Output is correct
30 Correct 148 ms 70904 KB Output is correct
31 Correct 1855 ms 135512 KB Output is correct
32 Correct 334 ms 91592 KB Output is correct
33 Correct 1669 ms 132548 KB Output is correct
34 Correct 1727 ms 133048 KB Output is correct
35 Correct 1864 ms 135680 KB Output is correct
36 Correct 1772 ms 134328 KB Output is correct
37 Correct 1179 ms 128632 KB Output is correct
38 Correct 1138 ms 126684 KB Output is correct
39 Correct 881 ms 120708 KB Output is correct
40 Correct 950 ms 121720 KB Output is correct
41 Correct 1106 ms 119124 KB Output is correct
42 Correct 1382 ms 119384 KB Output is correct
43 Correct 246 ms 93180 KB Output is correct
44 Correct 1113 ms 118516 KB Output is correct
45 Correct 1062 ms 116076 KB Output is correct
46 Correct 965 ms 111588 KB Output is correct
47 Correct 576 ms 109312 KB Output is correct
48 Correct 564 ms 108352 KB Output is correct
49 Correct 690 ms 112476 KB Output is correct
50 Correct 772 ms 117360 KB Output is correct
51 Correct 705 ms 111168 KB Output is correct
52 Correct 957 ms 137964 KB Output is correct
53 Correct 823 ms 123984 KB Output is correct
54 Correct 1339 ms 131104 KB Output is correct
55 Correct 994 ms 127236 KB Output is correct
56 Correct 975 ms 129756 KB Output is correct
57 Correct 1061 ms 121532 KB Output is correct
58 Correct 1010 ms 125584 KB Output is correct
59 Correct 1028 ms 129260 KB Output is correct
60 Correct 1083 ms 121200 KB Output is correct
61 Correct 283 ms 102608 KB Output is correct
62 Correct 962 ms 139672 KB Output is correct
63 Correct 1104 ms 131724 KB Output is correct
64 Correct 1215 ms 130032 KB Output is correct
65 Correct 1225 ms 126776 KB Output is correct
66 Correct 1130 ms 121240 KB Output is correct
67 Correct 427 ms 101036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 70904 KB Output is correct
2 Correct 89 ms 70776 KB Output is correct
3 Correct 89 ms 70884 KB Output is correct
4 Correct 87 ms 70748 KB Output is correct
5 Correct 89 ms 70904 KB Output is correct
6 Correct 169 ms 71032 KB Output is correct
7 Correct 89 ms 71032 KB Output is correct
8 Correct 94 ms 71232 KB Output is correct
9 Correct 90 ms 71160 KB Output is correct
10 Correct 91 ms 71160 KB Output is correct
11 Correct 91 ms 71024 KB Output is correct
12 Correct 90 ms 71112 KB Output is correct
13 Correct 92 ms 71004 KB Output is correct
14 Correct 90 ms 71156 KB Output is correct
15 Correct 90 ms 71160 KB Output is correct
16 Correct 90 ms 71160 KB Output is correct
17 Correct 101 ms 71032 KB Output is correct
18 Correct 97 ms 71132 KB Output is correct
19 Correct 101 ms 71140 KB Output is correct
20 Correct 95 ms 71132 KB Output is correct
21 Correct 97 ms 71032 KB Output is correct
22 Correct 94 ms 71152 KB Output is correct
23 Correct 101 ms 71160 KB Output is correct
24 Correct 100 ms 71132 KB Output is correct
25 Correct 92 ms 71032 KB Output is correct
26 Correct 92 ms 71032 KB Output is correct
27 Correct 95 ms 71032 KB Output is correct
28 Correct 94 ms 71156 KB Output is correct
29 Correct 90 ms 71032 KB Output is correct
30 Correct 148 ms 70904 KB Output is correct
31 Correct 1855 ms 135512 KB Output is correct
32 Correct 334 ms 91592 KB Output is correct
33 Correct 1669 ms 132548 KB Output is correct
34 Correct 1727 ms 133048 KB Output is correct
35 Correct 1864 ms 135680 KB Output is correct
36 Correct 1772 ms 134328 KB Output is correct
37 Correct 1179 ms 128632 KB Output is correct
38 Correct 1138 ms 126684 KB Output is correct
39 Correct 881 ms 120708 KB Output is correct
40 Correct 950 ms 121720 KB Output is correct
41 Correct 1106 ms 119124 KB Output is correct
42 Correct 1382 ms 119384 KB Output is correct
43 Correct 246 ms 93180 KB Output is correct
44 Correct 1113 ms 118516 KB Output is correct
45 Correct 1062 ms 116076 KB Output is correct
46 Correct 965 ms 111588 KB Output is correct
47 Correct 576 ms 109312 KB Output is correct
48 Correct 564 ms 108352 KB Output is correct
49 Correct 690 ms 112476 KB Output is correct
50 Correct 772 ms 117360 KB Output is correct
51 Correct 705 ms 111168 KB Output is correct
52 Execution timed out 5118 ms 270688 KB Time limit exceeded
53 Halted 0 ms 0 KB -