답안 #160732

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
160732 2019-10-29T15:05:06 Z Minnakhmetov 새 집 (APIO18_new_home) C++14
5 / 100
3172 ms 1048580 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 = 6e5 + 5, INF = 1e9;
vector<int> vx;
multiset<int> occ[N], t[N];
int n, q, k, cc;
int ans[N];

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

    void push(int v, int L, int R) {
        if (!up[v].empty()) {            
            if (L != R) {
                up[v * 2].insert(up[v * 2].end(), all(up[v]));
                up[v * 2 + 1].insert(up[v * 2 + 1].end(), all(up[v]));
            }
            else {
                for (int x : up[v]) {
                    if (x < 0) {
                        t[L].erase(t[L].find(-x));
                    }
                    else
                        t[L].insert(x);
                }    
            }
            up[v].clear();
        }
    }

    void upd(int l, int r, int x, int v, int L, int R) {
        push(v, L, R);
        if (l > r)
            return;
        if (l == L && r == R) {
            up[v].push_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);
        }
    }
} segt[2];

int que(int x, int v, int L, int R, ST &a, ST &b) {
    a.push(v, L, R);
    b.push(v, L, R);

    if (L == R) {
        if (a.t[L].size() + b.t[L].size() < k)
            return -1;

        int ans = 0;
        if (!a.t[L].empty())
            ans = max(ans, vx[L] - *a.t[L].begin());
        if (!b.t[L].empty())
            ans = max(ans, *b.t[L].rbegin() - vx[L]);

        return ans;
    }
    int m = (L + R) >> 1;
    if (x <= m)
        return que(x, v * 2, L, m, a, b);
    return que(x, v * 2 + 1, m + 1, R, a, b);
}

void updBetween(int x, int y, int k) {
    if (x == y)
        return;

    // cout << "BET " << x << " " << y << " " << k << "\n";

    int m = (x + y) / 2,
        m1 = upper_bound(all(vx), m) - vx.begin(),
        x1 = lower_bound(all(vx), x) - vx.begin(),
        y1 = lower_bound(all(vx), y) - vx.begin();

    segt[0].upd(x1, m1 - 1, k * x, 1, 0, cc - 1);
    segt[1].upd(m1, y1 - 1, k * y, 1, 0, cc - 1);
}

void updBegin(int x, int k) {
    // cout << "BEG " << x << " " << k << "\n";
    // return;

    int x1 = lower_bound(all(vx), x) - vx.begin();
    segt[1].upd(0, x1 - 1, x * k, 1, 0, cc - 1);
}

void updEnd(int x, int k) {
    // cout << "END " << x << " " << k << "\n";

    int x1 = lower_bound(all(vx), x) - vx.begin();
    segt[0].upd(x1, cc - 1, x * k, 1, 0, cc - 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 < q; i++) {
        int x, y;
        cin >> x >> y;
        evs.push_back({y, 2, x, i});
        vx.push_back(x);
    }

    sort(all(vx));
    vx.erase(unique(all(vx)), vx.end());

    cc = vx.size();

    sort(all(evs), [](const E &lt, const E &rt) {
        return lt.p == rt.p ? lt.t < rt.t : lt.p < rt.p;
    });

    for (E e : evs) {
        // cout << e.p << " " << e.t << " " << e.x << " " << e.y << "\n";
        if (e.t == 0) {
            if (!occ[e.y].empty()) {
                auto it = occ[e.y].upper_bound(e.x);

                if (it == occ[e.y].begin()) {
                    updBegin(*occ[e.y].begin(), -1);
                }
                else if (it == occ[e.y].end()) {
                    updEnd(*occ[e.y].rbegin(), -1);
                }
                else {
                    updBetween(*prev(it), *it, -1);
                }
            }

            auto it = occ[e.y].insert(e.x);

            if (it == occ[e.y].begin())
                updBegin(*it, 1);
            else
                updBetween(*prev(it), *it, 1);

            if (next(it) == occ[e.y].end())
                updEnd(*it, 1);
            else
                updBetween(*it, *next(it), 1);
        }
        else if (e.t == 1) {
            auto it = occ[e.y].lower_bound(e.x);

            if (it == occ[e.y].begin())
                updBegin(*it, -1);
            else
                updBetween(*prev(it), *it, -1);

            if (next(it) == occ[e.y].end())
                updEnd(*it, -1);
            else
                updBetween(*it, *next(it), -1);

            it++;
            occ[e.y].erase(prev(it));

            if (!occ[e.y].empty()) {
                if (it == occ[e.y].begin()) {
                    updBegin(*occ[e.y].begin(), 1);
                }
                else if (it == occ[e.y].end()) {
                    updEnd(*occ[e.y].rbegin(), 1);
                }
                else {
                    updBetween(*prev(it), *it, 1);
                }
            }
        }
        else {
            e.x = lower_bound(all(vx), e.x) - vx.begin();
            ans[e.y] = que(e.x, 1, 0, cc - 1, segt[0], segt[1]);
        }
    }

    for (int i = 0; i < q; i++) {
        cout << ans[i] << "\n";
    }

    return 0;
}

Compilation message

new_home.cpp: In function 'int que(int, int, int, int, ST&, ST&)':
new_home.cpp:61:43: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (a.t[L].size() + b.t[L].size() < k)
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 217 ms 225844 KB Output is correct
2 Correct 225 ms 225788 KB Output is correct
3 Correct 216 ms 226040 KB Output is correct
4 Correct 225 ms 225912 KB Output is correct
5 Correct 226 ms 225912 KB Output is correct
6 Correct 247 ms 227192 KB Output is correct
7 Correct 283 ms 232252 KB Output is correct
8 Correct 288 ms 232056 KB Output is correct
9 Correct 301 ms 236612 KB Output is correct
10 Correct 231 ms 227068 KB Output is correct
11 Correct 247 ms 229608 KB Output is correct
12 Correct 225 ms 227380 KB Output is correct
13 Correct 251 ms 229480 KB Output is correct
14 Correct 227 ms 228856 KB Output is correct
15 Correct 283 ms 233828 KB Output is correct
16 Correct 287 ms 235896 KB Output is correct
17 Correct 278 ms 231112 KB Output is correct
18 Correct 287 ms 234000 KB Output is correct
19 Correct 320 ms 235768 KB Output is correct
20 Correct 290 ms 231032 KB Output is correct
21 Correct 214 ms 225984 KB Output is correct
22 Correct 302 ms 237504 KB Output is correct
23 Correct 316 ms 235256 KB Output is correct
24 Correct 305 ms 232956 KB Output is correct
25 Correct 291 ms 230384 KB Output is correct
26 Correct 255 ms 229504 KB Output is correct
27 Correct 226 ms 225912 KB Output is correct
28 Correct 243 ms 229240 KB Output is correct
29 Correct 231 ms 228984 KB Output is correct
30 Correct 224 ms 228472 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 217 ms 225844 KB Output is correct
2 Correct 225 ms 225788 KB Output is correct
3 Correct 216 ms 226040 KB Output is correct
4 Correct 225 ms 225912 KB Output is correct
5 Correct 226 ms 225912 KB Output is correct
6 Correct 247 ms 227192 KB Output is correct
7 Correct 283 ms 232252 KB Output is correct
8 Correct 288 ms 232056 KB Output is correct
9 Correct 301 ms 236612 KB Output is correct
10 Correct 231 ms 227068 KB Output is correct
11 Correct 247 ms 229608 KB Output is correct
12 Correct 225 ms 227380 KB Output is correct
13 Correct 251 ms 229480 KB Output is correct
14 Correct 227 ms 228856 KB Output is correct
15 Correct 283 ms 233828 KB Output is correct
16 Correct 287 ms 235896 KB Output is correct
17 Correct 278 ms 231112 KB Output is correct
18 Correct 287 ms 234000 KB Output is correct
19 Correct 320 ms 235768 KB Output is correct
20 Correct 290 ms 231032 KB Output is correct
21 Correct 214 ms 225984 KB Output is correct
22 Correct 302 ms 237504 KB Output is correct
23 Correct 316 ms 235256 KB Output is correct
24 Correct 305 ms 232956 KB Output is correct
25 Correct 291 ms 230384 KB Output is correct
26 Correct 255 ms 229504 KB Output is correct
27 Correct 226 ms 225912 KB Output is correct
28 Correct 243 ms 229240 KB Output is correct
29 Correct 231 ms 228984 KB Output is correct
30 Correct 224 ms 228472 KB Output is correct
31 Runtime error 3172 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
32 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2133 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2153 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 217 ms 225844 KB Output is correct
2 Correct 225 ms 225788 KB Output is correct
3 Correct 216 ms 226040 KB Output is correct
4 Correct 225 ms 225912 KB Output is correct
5 Correct 226 ms 225912 KB Output is correct
6 Correct 247 ms 227192 KB Output is correct
7 Correct 283 ms 232252 KB Output is correct
8 Correct 288 ms 232056 KB Output is correct
9 Correct 301 ms 236612 KB Output is correct
10 Correct 231 ms 227068 KB Output is correct
11 Correct 247 ms 229608 KB Output is correct
12 Correct 225 ms 227380 KB Output is correct
13 Correct 251 ms 229480 KB Output is correct
14 Correct 227 ms 228856 KB Output is correct
15 Correct 283 ms 233828 KB Output is correct
16 Correct 287 ms 235896 KB Output is correct
17 Correct 278 ms 231112 KB Output is correct
18 Correct 287 ms 234000 KB Output is correct
19 Correct 320 ms 235768 KB Output is correct
20 Correct 290 ms 231032 KB Output is correct
21 Correct 214 ms 225984 KB Output is correct
22 Correct 302 ms 237504 KB Output is correct
23 Correct 316 ms 235256 KB Output is correct
24 Correct 305 ms 232956 KB Output is correct
25 Correct 291 ms 230384 KB Output is correct
26 Correct 255 ms 229504 KB Output is correct
27 Correct 226 ms 225912 KB Output is correct
28 Correct 243 ms 229240 KB Output is correct
29 Correct 231 ms 228984 KB Output is correct
30 Correct 224 ms 228472 KB Output is correct
31 Runtime error 3172 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
32 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 217 ms 225844 KB Output is correct
2 Correct 225 ms 225788 KB Output is correct
3 Correct 216 ms 226040 KB Output is correct
4 Correct 225 ms 225912 KB Output is correct
5 Correct 226 ms 225912 KB Output is correct
6 Correct 247 ms 227192 KB Output is correct
7 Correct 283 ms 232252 KB Output is correct
8 Correct 288 ms 232056 KB Output is correct
9 Correct 301 ms 236612 KB Output is correct
10 Correct 231 ms 227068 KB Output is correct
11 Correct 247 ms 229608 KB Output is correct
12 Correct 225 ms 227380 KB Output is correct
13 Correct 251 ms 229480 KB Output is correct
14 Correct 227 ms 228856 KB Output is correct
15 Correct 283 ms 233828 KB Output is correct
16 Correct 287 ms 235896 KB Output is correct
17 Correct 278 ms 231112 KB Output is correct
18 Correct 287 ms 234000 KB Output is correct
19 Correct 320 ms 235768 KB Output is correct
20 Correct 290 ms 231032 KB Output is correct
21 Correct 214 ms 225984 KB Output is correct
22 Correct 302 ms 237504 KB Output is correct
23 Correct 316 ms 235256 KB Output is correct
24 Correct 305 ms 232956 KB Output is correct
25 Correct 291 ms 230384 KB Output is correct
26 Correct 255 ms 229504 KB Output is correct
27 Correct 226 ms 225912 KB Output is correct
28 Correct 243 ms 229240 KB Output is correct
29 Correct 231 ms 228984 KB Output is correct
30 Correct 224 ms 228472 KB Output is correct
31 Runtime error 3172 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
32 Halted 0 ms 0 KB -