답안 #1045790

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1045790 2024-08-06T07:44:10 Z Whisper Road Construction (JOI21_road_construction) C++17
0 / 100
53 ms 12344 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define int long long
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define FORD(i, a, b) for (int i = (b); i >= (a); i --)
#define REP(i, a) for (int i = 0; i < (a); ++i)
#define REPD(i, a) for (int i = (a) - 1; i >= 0; --i)

#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)


constexpr ll LINF = (1ll << 60);
constexpr int INF = (1ll << 30);
constexpr int Mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

/*
    Phu Trong from Nguyen Tat Thanh High School for gifted student
*/

template <class X, class Y>
    bool minimize(X &x, const Y &y){
        X eps = 1e-9;
        if (x > y + eps) {x = y; return 1;}
        return 0;
    }

template <class X, class Y>
    bool maximize(X &x, const Y &y){
        X eps = 1e-9;
        if (x + eps < y) {x = y; return 1;}
        return 0;
    }
#define MAX             200005
int N, K;

pair<int, int> A[MAX];

int ans[MAX];
void process(void){
    cin >> N >> K;
    for (int i = 1; i <= N; ++i){
        int x, y;
        cin >> x >> y;
        A[i] = make_pair(x + y, x - y);
    }
    sort(A + 1, A + N + 1);
    /*
        After rotating the plane by 45 degree, the Manhattan distance becomes Chebyshev distance instead
        Chebyshev between two point A(x1, y1) and B(x2, y2) is max(|x2 - x1|, |y2 - y1|)
    */

    auto check = [&](int x){
        multiset<int> mySet;

        int j = 1, cnt = 0;
        for (int i = 1; i <= N; ++i){
            while (A[i].first - A[j].first > x){
                mySet.erase(mySet.find(A[j].second));
                ++j;
            }

            auto it = mySet.lower_bound(A[j].second - x);
            for (; it != mySet.end(); ++it){
                if ((*it) > A[j].second + x) break;
                ++cnt;
                if (cnt > K) return false;
            }
            mySet.insert(A[i].second);
        }
        return true;
    };
    int l = -1, r = 3e9;
    while (r - l > 1){
        int m = (l + r) >> 1;
        if(check(m)) l = m;
        else r = m;
    }

    multiset<pair<int, int>> mySet;

    int j = 1;

    vector<int> res;

    for (int i = 1; i <= N; ++i){
        while (A[i].first - A[j].first > l) {
            mySet.erase(mySet.find(make_pair(A[j].second, A[j].first)));
            ++j;
        }
        auto it = mySet.lower_bound(make_pair(A[i].second - l, -INF));
        for (; it != mySet.end(); ++it){
            if ((*it).first > A[i].second + l) break;

            int dis = max(abs(A[i].first - (*it).second), abs(A[i].second - (*it).first));
            res.emplace_back(dis);
        }
        mySet.insert(make_pair(A[i].second, A[i].first));
    }
    sort(res.begin(), res.end());
    for (int i = 0; i < K; ++i){
        if (i + 1 > (int)res.size()) break;
        ans[i] = res[i];
    }
    for (int i = res.size(); i < K; ++i){
        ans[i] = l + 1;
    }
    for (int i = 0; i < K; ++i) cout << ans[i] << '\n';
}
signed main(){
    #define name "Whisper"
    cin.tie(nullptr) -> sync_with_stdio(false);
    //freopen(name".inp", "r", stdin);
    //freopen(name".out", "w", stdout);
    process();
    return (0 ^ 0);
}




# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 7052 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 23 ms 12344 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 39 ms 10952 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 39 ms 10952 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 7052 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 7052 KB Output isn't correct
2 Halted 0 ms 0 KB -