답안 #412621

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
412621 2021-05-27T08:07:03 Z dolphingarlic 새 집 (APIO18_new_home) C++14
57 / 100
5000 ms 185448 KB
#include <bits/stdc++.h>
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("O3")
#pragma GCC target("sse4,avx2,fma,avx")
typedef long long ll;
using namespace std;

const int INF = 1e8;

vector<int> c_loc, c_time;
unordered_map<int, vector<pair<int, int>>> queries, toggle, ins, del;
vector<tuple<int, int, int>> stores[300001];
int ans[300001], segtree[1200001];
multiset<int> rays[300001];

int query(int loc, int node = 1, int l = 0, int r = c_loc.size() - 1) {
    if (r <= loc) return segtree[node];
    if (l > loc) return -1;
    int mid = (l + r) / 2;
    return max(query(loc, node * 2, l, mid),
               query(loc, node * 2 + 1, mid + 1, r));
}

void update(int loc, int val, int node = 1, int l = 0,
            int r = c_loc.size() - 1) {
    if (l == r)
        segtree[node] = val;
    else {
        int mid = (l + r) / 2;
        if (loc > mid)
            update(loc, val, node * 2 + 1, mid + 1, r);
        else
            update(loc, val, node * 2, l, mid);
        segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
    }
}

void ins_ray(int loc, int val) {
    if (loc == c_loc.size()) return;
    rays[loc].insert(val);
    update(loc, *rays[loc].rbegin());
}

void del_ray(int loc, int val) {
    if (loc == c_loc.size()) return;
    rays[loc].erase(rays[loc].find(val));
    update(loc, *rays[loc].rbegin());
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, k, q;
    cin >> n >> k >> q;
    for (int i = 1; i <= n; i++) {
        int loc, type, a, b;
        cin >> loc >> type >> a >> b;
        stores[type].push_back({a, loc, 0});
        stores[type].push_back({b + 1, loc, 1});
    }
    for (int i = 1; i <= q; i++) {
        int loc, time;
        cin >> loc >> time;
        c_loc.push_back(2 * loc);
        c_time.push_back(time);
        queries[time].push_back({i, loc});
        ans[i] = -1;
    }
    sort(c_loc.begin(), c_loc.end());
    c_loc.erase(unique(c_loc.begin(), c_loc.end()), c_loc.end());
    sort(c_time.begin(), c_time.end());
    c_time.erase(unique(c_time.begin(), c_time.end()), c_time.end());
    c_time.push_back(INF + 1);

    for (int _ : {0, 1}) {
        for (int i = 0; i < c_loc.size(); i++) {
            rays[i].clear();
            rays[i].insert(-INF);
        }

        for (int t = 1; t <= k; t++) {
            sort(stores[t].begin(), stores[t].end());
            map<int, int> active, ray_at;
            for (auto i : stores[t]) {
                int time, loc, close;
                tie(time, loc, close) = i;
                time = *lower_bound(c_time.begin(), c_time.end(), time);
                if (close) {
                    active[loc]--;
                    if (!active[loc]) {
                        active.erase(loc);
                        auto ub = active.upper_bound(loc);
                        del[time].push_back({ray_at[loc], loc});
                        ray_at.erase(loc);
                        if (ub != active.end()) {
                            del[time].push_back({ray_at[ub->first], ub->first});
                            if (ub != active.begin()) {
                                ins[time].push_back(
                                    {prev(ub)->first + ub->first, ub->first});
                                ray_at[ub->first] = prev(ub)->first + ub->first;
                            } else {
                                ins[time].push_back({0, ub->first});
                                ray_at[ub->first] = 0;
                            }
                        }
                    }
                } else {
                    if (!active.count(loc)) {
                        auto ub = active.upper_bound(loc);
                        if (ub != active.end()) {
                            del[time].push_back({ray_at[ub->first], ub->first});
                            ins[time].push_back({ub->first + loc, ub->first});
                            ray_at[ub->first] = ub->first + loc;
                        }
                        if (ub != active.begin()) {
                            ins[time].push_back({loc + prev(ub)->first, loc});
                            ray_at[loc] = loc + prev(ub)->first;
                        } else {
                            ins[time].push_back({0, loc});
                            ray_at[loc] = 0;
                        }
                    }
                    active[loc]++;
                }
                toggle[time].push_back({t, 1 - 2 * close});
            }
        }

        unordered_map<int, int> active;
        fill_n(segtree + 1, 4 * c_loc.size(), -INF);
        for (int t : c_time) {
            for (pair<int, int> i : ins[t])
                ins_ray(lower_bound(c_loc.begin(), c_loc.end(), i.first) -
                            c_loc.begin(),
                        i.second);
            for (pair<int, int> i : del[t])
                del_ray(lower_bound(c_loc.begin(), c_loc.end(), i.first) -
                            c_loc.begin(),
                        i.second);
            for (pair<int, int> i : toggle[t]) {
                active[i.first] += i.second;
                if (!active[i.first]) active.erase(i.first);
            }
            if (active.size() == k) {
                for (pair<int, int> i : queries[t]) {
                    int res = query(
                        lower_bound(c_loc.begin(), c_loc.end(), 2 * i.second) -
                        c_loc.begin());
                    if (res > 0)
                        ans[i.first] = max(ans[i.first], res - i.second);
                }
            }
        }

        for (int i = 1; i <= k; i++)
            for (auto& j : stores[i]) get<1>(j) = INF + 1 - get<1>(j);
        for (auto& i : queries)
            for (auto& j : i.second) j.second = INF + 1 - j.second;
        for (auto& i : c_loc) i = 2 * INF + 2 - i;
        reverse(c_loc.begin(), c_loc.end());
        toggle.clear(), ins.clear();
        del.clear();
    }
    for (int i = 1; i <= q; i++) cout << ans[i] << '\n';
    return 0;
}

Compilation message

new_home.cpp: In function 'void ins_ray(int, int)':
new_home.cpp:39:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     if (loc == c_loc.size()) return;
      |         ~~~~^~~~~~~~~~~~~~~
new_home.cpp: In function 'void del_ray(int, int)':
new_home.cpp:45:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     if (loc == c_loc.size()) return;
      |         ~~~~^~~~~~~~~~~~~~~
new_home.cpp: In function 'int main()':
new_home.cpp:75:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |         for (int i = 0; i < c_loc.size(); i++) {
      |                         ~~^~~~~~~~~~~~~~
new_home.cpp:143:31: warning: comparison of integer expressions of different signedness: 'std::unordered_map<int, int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  143 |             if (active.size() == k) {
      |                 ~~~~~~~~~~~~~~^~~~
new_home.cpp:74:14: warning: unused variable '_' [-Wunused-variable]
   74 |     for (int _ : {0, 1}) {
      |              ^
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 21452 KB Output is correct
2 Correct 13 ms 21348 KB Output is correct
3 Correct 13 ms 21452 KB Output is correct
4 Correct 13 ms 21424 KB Output is correct
5 Correct 13 ms 21528 KB Output is correct
6 Correct 16 ms 21688 KB Output is correct
7 Correct 13 ms 21664 KB Output is correct
8 Correct 15 ms 21596 KB Output is correct
9 Correct 14 ms 21580 KB Output is correct
10 Correct 15 ms 21692 KB Output is correct
11 Correct 14 ms 21580 KB Output is correct
12 Correct 15 ms 21576 KB Output is correct
13 Correct 14 ms 21580 KB Output is correct
14 Correct 14 ms 21668 KB Output is correct
15 Correct 14 ms 21676 KB Output is correct
16 Correct 14 ms 21592 KB Output is correct
17 Correct 14 ms 21580 KB Output is correct
18 Correct 14 ms 21600 KB Output is correct
19 Correct 14 ms 21608 KB Output is correct
20 Correct 14 ms 21580 KB Output is correct
21 Correct 13 ms 21544 KB Output is correct
22 Correct 14 ms 21672 KB Output is correct
23 Correct 14 ms 21580 KB Output is correct
24 Correct 14 ms 21580 KB Output is correct
25 Correct 14 ms 21576 KB Output is correct
26 Correct 15 ms 21580 KB Output is correct
27 Correct 14 ms 21456 KB Output is correct
28 Correct 14 ms 21600 KB Output is correct
29 Correct 14 ms 21556 KB Output is correct
30 Correct 13 ms 21580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 21452 KB Output is correct
2 Correct 13 ms 21348 KB Output is correct
3 Correct 13 ms 21452 KB Output is correct
4 Correct 13 ms 21424 KB Output is correct
5 Correct 13 ms 21528 KB Output is correct
6 Correct 16 ms 21688 KB Output is correct
7 Correct 13 ms 21664 KB Output is correct
8 Correct 15 ms 21596 KB Output is correct
9 Correct 14 ms 21580 KB Output is correct
10 Correct 15 ms 21692 KB Output is correct
11 Correct 14 ms 21580 KB Output is correct
12 Correct 15 ms 21576 KB Output is correct
13 Correct 14 ms 21580 KB Output is correct
14 Correct 14 ms 21668 KB Output is correct
15 Correct 14 ms 21676 KB Output is correct
16 Correct 14 ms 21592 KB Output is correct
17 Correct 14 ms 21580 KB Output is correct
18 Correct 14 ms 21600 KB Output is correct
19 Correct 14 ms 21608 KB Output is correct
20 Correct 14 ms 21580 KB Output is correct
21 Correct 13 ms 21544 KB Output is correct
22 Correct 14 ms 21672 KB Output is correct
23 Correct 14 ms 21580 KB Output is correct
24 Correct 14 ms 21580 KB Output is correct
25 Correct 14 ms 21576 KB Output is correct
26 Correct 15 ms 21580 KB Output is correct
27 Correct 14 ms 21456 KB Output is correct
28 Correct 14 ms 21600 KB Output is correct
29 Correct 14 ms 21556 KB Output is correct
30 Correct 13 ms 21580 KB Output is correct
31 Correct 1316 ms 52800 KB Output is correct
32 Correct 87 ms 25840 KB Output is correct
33 Correct 1225 ms 51264 KB Output is correct
34 Correct 1170 ms 51840 KB Output is correct
35 Correct 1256 ms 52080 KB Output is correct
36 Correct 1277 ms 52112 KB Output is correct
37 Correct 1059 ms 50808 KB Output is correct
38 Correct 1018 ms 50508 KB Output is correct
39 Correct 878 ms 50272 KB Output is correct
40 Correct 906 ms 50384 KB Output is correct
41 Correct 855 ms 49532 KB Output is correct
42 Correct 809 ms 50068 KB Output is correct
43 Correct 74 ms 26740 KB Output is correct
44 Correct 861 ms 50028 KB Output is correct
45 Correct 817 ms 49652 KB Output is correct
46 Correct 761 ms 49680 KB Output is correct
47 Correct 611 ms 48964 KB Output is correct
48 Correct 621 ms 48716 KB Output is correct
49 Correct 660 ms 49228 KB Output is correct
50 Correct 677 ms 49820 KB Output is correct
51 Correct 676 ms 49360 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4249 ms 183704 KB Output is correct
2 Correct 3609 ms 181748 KB Output is correct
3 Correct 3000 ms 172476 KB Output is correct
4 Correct 4078 ms 177124 KB Output is correct
5 Correct 3480 ms 180276 KB Output is correct
6 Correct 3572 ms 181656 KB Output is correct
7 Correct 2901 ms 172356 KB Output is correct
8 Correct 3993 ms 176180 KB Output is correct
9 Correct 4266 ms 185448 KB Output is correct
10 Correct 4056 ms 183628 KB Output is correct
11 Correct 3374 ms 181636 KB Output is correct
12 Correct 3744 ms 183780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5049 ms 154088 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 21452 KB Output is correct
2 Correct 13 ms 21348 KB Output is correct
3 Correct 13 ms 21452 KB Output is correct
4 Correct 13 ms 21424 KB Output is correct
5 Correct 13 ms 21528 KB Output is correct
6 Correct 16 ms 21688 KB Output is correct
7 Correct 13 ms 21664 KB Output is correct
8 Correct 15 ms 21596 KB Output is correct
9 Correct 14 ms 21580 KB Output is correct
10 Correct 15 ms 21692 KB Output is correct
11 Correct 14 ms 21580 KB Output is correct
12 Correct 15 ms 21576 KB Output is correct
13 Correct 14 ms 21580 KB Output is correct
14 Correct 14 ms 21668 KB Output is correct
15 Correct 14 ms 21676 KB Output is correct
16 Correct 14 ms 21592 KB Output is correct
17 Correct 14 ms 21580 KB Output is correct
18 Correct 14 ms 21600 KB Output is correct
19 Correct 14 ms 21608 KB Output is correct
20 Correct 14 ms 21580 KB Output is correct
21 Correct 13 ms 21544 KB Output is correct
22 Correct 14 ms 21672 KB Output is correct
23 Correct 14 ms 21580 KB Output is correct
24 Correct 14 ms 21580 KB Output is correct
25 Correct 14 ms 21576 KB Output is correct
26 Correct 15 ms 21580 KB Output is correct
27 Correct 14 ms 21456 KB Output is correct
28 Correct 14 ms 21600 KB Output is correct
29 Correct 14 ms 21556 KB Output is correct
30 Correct 13 ms 21580 KB Output is correct
31 Correct 1316 ms 52800 KB Output is correct
32 Correct 87 ms 25840 KB Output is correct
33 Correct 1225 ms 51264 KB Output is correct
34 Correct 1170 ms 51840 KB Output is correct
35 Correct 1256 ms 52080 KB Output is correct
36 Correct 1277 ms 52112 KB Output is correct
37 Correct 1059 ms 50808 KB Output is correct
38 Correct 1018 ms 50508 KB Output is correct
39 Correct 878 ms 50272 KB Output is correct
40 Correct 906 ms 50384 KB Output is correct
41 Correct 855 ms 49532 KB Output is correct
42 Correct 809 ms 50068 KB Output is correct
43 Correct 74 ms 26740 KB Output is correct
44 Correct 861 ms 50028 KB Output is correct
45 Correct 817 ms 49652 KB Output is correct
46 Correct 761 ms 49680 KB Output is correct
47 Correct 611 ms 48964 KB Output is correct
48 Correct 621 ms 48716 KB Output is correct
49 Correct 660 ms 49228 KB Output is correct
50 Correct 677 ms 49820 KB Output is correct
51 Correct 676 ms 49360 KB Output is correct
52 Correct 727 ms 51080 KB Output is correct
53 Correct 594 ms 49216 KB Output is correct
54 Correct 851 ms 51016 KB Output is correct
55 Correct 744 ms 50912 KB Output is correct
56 Correct 682 ms 51220 KB Output is correct
57 Correct 786 ms 49544 KB Output is correct
58 Correct 699 ms 49952 KB Output is correct
59 Correct 683 ms 50556 KB Output is correct
60 Correct 772 ms 49980 KB Output is correct
61 Correct 148 ms 31944 KB Output is correct
62 Correct 701 ms 52056 KB Output is correct
63 Correct 771 ms 50824 KB Output is correct
64 Correct 796 ms 50124 KB Output is correct
65 Correct 831 ms 49884 KB Output is correct
66 Correct 890 ms 50212 KB Output is correct
67 Correct 252 ms 29912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 21452 KB Output is correct
2 Correct 13 ms 21348 KB Output is correct
3 Correct 13 ms 21452 KB Output is correct
4 Correct 13 ms 21424 KB Output is correct
5 Correct 13 ms 21528 KB Output is correct
6 Correct 16 ms 21688 KB Output is correct
7 Correct 13 ms 21664 KB Output is correct
8 Correct 15 ms 21596 KB Output is correct
9 Correct 14 ms 21580 KB Output is correct
10 Correct 15 ms 21692 KB Output is correct
11 Correct 14 ms 21580 KB Output is correct
12 Correct 15 ms 21576 KB Output is correct
13 Correct 14 ms 21580 KB Output is correct
14 Correct 14 ms 21668 KB Output is correct
15 Correct 14 ms 21676 KB Output is correct
16 Correct 14 ms 21592 KB Output is correct
17 Correct 14 ms 21580 KB Output is correct
18 Correct 14 ms 21600 KB Output is correct
19 Correct 14 ms 21608 KB Output is correct
20 Correct 14 ms 21580 KB Output is correct
21 Correct 13 ms 21544 KB Output is correct
22 Correct 14 ms 21672 KB Output is correct
23 Correct 14 ms 21580 KB Output is correct
24 Correct 14 ms 21580 KB Output is correct
25 Correct 14 ms 21576 KB Output is correct
26 Correct 15 ms 21580 KB Output is correct
27 Correct 14 ms 21456 KB Output is correct
28 Correct 14 ms 21600 KB Output is correct
29 Correct 14 ms 21556 KB Output is correct
30 Correct 13 ms 21580 KB Output is correct
31 Correct 1316 ms 52800 KB Output is correct
32 Correct 87 ms 25840 KB Output is correct
33 Correct 1225 ms 51264 KB Output is correct
34 Correct 1170 ms 51840 KB Output is correct
35 Correct 1256 ms 52080 KB Output is correct
36 Correct 1277 ms 52112 KB Output is correct
37 Correct 1059 ms 50808 KB Output is correct
38 Correct 1018 ms 50508 KB Output is correct
39 Correct 878 ms 50272 KB Output is correct
40 Correct 906 ms 50384 KB Output is correct
41 Correct 855 ms 49532 KB Output is correct
42 Correct 809 ms 50068 KB Output is correct
43 Correct 74 ms 26740 KB Output is correct
44 Correct 861 ms 50028 KB Output is correct
45 Correct 817 ms 49652 KB Output is correct
46 Correct 761 ms 49680 KB Output is correct
47 Correct 611 ms 48964 KB Output is correct
48 Correct 621 ms 48716 KB Output is correct
49 Correct 660 ms 49228 KB Output is correct
50 Correct 677 ms 49820 KB Output is correct
51 Correct 676 ms 49360 KB Output is correct
52 Correct 4249 ms 183704 KB Output is correct
53 Correct 3609 ms 181748 KB Output is correct
54 Correct 3000 ms 172476 KB Output is correct
55 Correct 4078 ms 177124 KB Output is correct
56 Correct 3480 ms 180276 KB Output is correct
57 Correct 3572 ms 181656 KB Output is correct
58 Correct 2901 ms 172356 KB Output is correct
59 Correct 3993 ms 176180 KB Output is correct
60 Correct 4266 ms 185448 KB Output is correct
61 Correct 4056 ms 183628 KB Output is correct
62 Correct 3374 ms 181636 KB Output is correct
63 Correct 3744 ms 183780 KB Output is correct
64 Execution timed out 5049 ms 154088 KB Time limit exceeded
65 Halted 0 ms 0 KB -