답안 #575471

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
575471 2022-06-10T18:04:29 Z rainliofficial Road Construction (JOI21_road_construction) C++17
100 / 100
2011 ms 19508 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
#define sz(x) (int)x.size()
#define f first
#define s second

/* 
Date: 2022/06/10
Problem Link: https://oj.uz/problem/view/JOI21_road_construction
Topic(s): Binary search, sorting
Time Spent: 
Solution Outline:
- The distance between two points can be written as max(abs((xi + yi) - (xj + yj)), abs((xi - yi) - (xj - yj)))
Binary search on v, which is the kth largest value. We have to check whether there more or less than k roads with
cost <= v. 
- Maintain a sliding window of size v. 
- Sort the points by xi + yi. For a point i, remove all points j that has xj + yj further than v units away.
- Put xi - yi into the set. 
- We know all js that came before i must have xi + yi - (xj + yj) <= v. So we can simply call lower_bound on the set
with xi - yi - v and vi - vi + v. The range that it gives us will be the amount of points within v distance of i. 
*/

const int MAXN = 2e5+5;
int n, k;
vector<pll> arr;
vector<ll> res;

ll sum(const pll& a){
    return a.f + a.s;
}
ll dif(const pll& a){
    return a.f - a.s;
}


bool check(ll v, bool upd){
    int l = 0;
    auto cmp = [](const pll& a, const pll& b){
        if (dif(a) == dif(b)){
            return a < b;
        }else{
            return a.f - a.s < b.f - b.s;
        }
    };
    set<pll, decltype(cmp)> set(cmp);
    ll ans = 0;
    for (int i=0; i<n; i++){
        while (l < n && sum(arr[i]) - sum(arr[l]) > v){
            set.erase(arr[l]);
            l++;
        }
        auto inc = set.lower_bound(arr[i]);
        auto dec = inc;
        while (inc != set.end() && dif(*inc) - dif(arr[i]) <= v){
            if (upd) res.push_back(abs(arr[i].f - (*inc).f) + abs(arr[i].s - (*inc).s));
            inc++;
            ans++;
            if (!upd && ans >=k){
                return true;
            }
        }
        while (dec != set.begin() && dif(arr[i]) - dif(*prev(dec)) <= v){
            dec--;
            if (upd) res.push_back(abs(arr[i].f - (*dec).f) + abs(arr[i].s - (*dec).s));
            ans++;
            if (!upd && ans >=k){
                return true;
            }
        }
        set.insert(arr[i]);
    }
    return ans >= k;
}
int main(){
    cin.tie(0); ios_base::sync_with_stdio(0);
    // freopen("file.in", "r", stdin);
    // freopen("file.out", "w", stdout);
    cin >> n >> k;
    arr.resize(n);
    for (int i=0; i<n; i++){
        int x, y;
        cin >> x >> y;
        arr[i] = {x, y};
    }
    sort(arr.begin(), arr.end(), [](const pll& a, const pll& b){
        return a.f + a.s < b.f + b.s;
    });
    ll low = 0, high = 4e9;
    while (low < high){
        ll mid = (low + high)/2;
        if (check(mid, false)){
            high = mid;
        }else{
            low = mid+1;
        }
    }
    check(low, true);
    assert((int)res.size() >= k);
    sort(res.begin(), res.end());
    for (int i=0; i<k; i++){
        cout << res[i] << "\n";
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 130 ms 4940 KB Output is correct
2 Correct 132 ms 4948 KB Output is correct
3 Correct 123 ms 5068 KB Output is correct
4 Correct 112 ms 5068 KB Output is correct
5 Correct 126 ms 3808 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 375 ms 7576 KB Output is correct
2 Correct 373 ms 10532 KB Output is correct
3 Correct 113 ms 5004 KB Output is correct
4 Correct 293 ms 11536 KB Output is correct
5 Correct 307 ms 12632 KB Output is correct
6 Correct 310 ms 12548 KB Output is correct
7 Correct 272 ms 11600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 215 ms 4180 KB Output is correct
2 Correct 309 ms 4180 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 139 ms 6408 KB Output is correct
5 Correct 693 ms 8448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 215 ms 4180 KB Output is correct
2 Correct 309 ms 4180 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 139 ms 6408 KB Output is correct
5 Correct 693 ms 8448 KB Output is correct
6 Correct 457 ms 4180 KB Output is correct
7 Correct 413 ms 4180 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 316 ms 4180 KB Output is correct
11 Correct 110 ms 6392 KB Output is correct
12 Correct 687 ms 4220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 130 ms 4940 KB Output is correct
2 Correct 132 ms 4948 KB Output is correct
3 Correct 123 ms 5068 KB Output is correct
4 Correct 112 ms 5068 KB Output is correct
5 Correct 126 ms 3808 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 992 ms 6032 KB Output is correct
8 Correct 978 ms 6004 KB Output is correct
9 Correct 113 ms 5080 KB Output is correct
10 Correct 506 ms 5248 KB Output is correct
11 Correct 309 ms 7280 KB Output is correct
12 Correct 662 ms 9280 KB Output is correct
13 Correct 613 ms 8288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 130 ms 4940 KB Output is correct
2 Correct 132 ms 4948 KB Output is correct
3 Correct 123 ms 5068 KB Output is correct
4 Correct 112 ms 5068 KB Output is correct
5 Correct 126 ms 3808 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 375 ms 7576 KB Output is correct
8 Correct 373 ms 10532 KB Output is correct
9 Correct 113 ms 5004 KB Output is correct
10 Correct 293 ms 11536 KB Output is correct
11 Correct 307 ms 12632 KB Output is correct
12 Correct 310 ms 12548 KB Output is correct
13 Correct 272 ms 11600 KB Output is correct
14 Correct 215 ms 4180 KB Output is correct
15 Correct 309 ms 4180 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 139 ms 6408 KB Output is correct
18 Correct 693 ms 8448 KB Output is correct
19 Correct 457 ms 4180 KB Output is correct
20 Correct 413 ms 4180 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 0 ms 212 KB Output is correct
23 Correct 316 ms 4180 KB Output is correct
24 Correct 110 ms 6392 KB Output is correct
25 Correct 687 ms 4220 KB Output is correct
26 Correct 992 ms 6032 KB Output is correct
27 Correct 978 ms 6004 KB Output is correct
28 Correct 113 ms 5080 KB Output is correct
29 Correct 506 ms 5248 KB Output is correct
30 Correct 309 ms 7280 KB Output is correct
31 Correct 662 ms 9280 KB Output is correct
32 Correct 613 ms 8288 KB Output is correct
33 Correct 2011 ms 13448 KB Output is correct
34 Correct 1991 ms 13444 KB Output is correct
35 Correct 1288 ms 12708 KB Output is correct
36 Correct 1160 ms 19508 KB Output is correct
37 Correct 1184 ms 19384 KB Output is correct
38 Correct 1043 ms 13836 KB Output is correct