답안 #112390

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
112390 2019-05-19T10:24:45 Z Frankenween Drzava (COCI15_drzava) C++17
96 / 160
783 ms 6744 KB
#ifdef LOCAL
#define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>

#define ull unsigned long long
#define pll pair<ll, ll>
#define mp make_pair
#define ll long long
#define pb push_back
#define deb(x) cout << #x << " = " << x << endl
#define all(x) x.begin(), x.end()
#define ld long double
const ll mod1 = (ll)1e9 + 7;
const ll mod2 = (ll)1e9 + 9;
const ll BASE = 47;
const ll inf = (ll)1e18;
const long double e = 2.718281828459;
const long double pi = 3.141592653;
const ld EPS = 1e-9;


using namespace std;


template <class T>
istream& operator>>(istream &in, vector<T> &arr) {
    for (T &cnt : arr) {
        in >> cnt;
    }
    return in;
};


struct point {
    ld x, y;
    ll k;
};


ld dist(point a, point b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}


vector<point> arr;
ll n, k;


bool can(vector<point> &have, ld d, point pt) {
    ll mask = 0;
    for (int i = 0; i < have.size(); i++) {
        if (dist(have[i], pt) <= d) {
            mask |= ((mask << have[i].k) | (1LL << have[i].k));
            mask |= (mask >> k);
            mask &= ((1 << k) - 1);
        }
    }
    return (mask & 1);
}


bool check(ld d) {
    ll l = 0, r = -1;
    multiset<pair<ld, ll>> kek;
    for (int i = 0; i < n; i++) {
        while (r + 1 < n and abs(arr[r + 1].x - arr[i].x) <= d) {
            kek.insert({arr[r + 1].y, r + 1});
            r++;
        }
        while (abs(arr[l].x - arr[i].x) > d) {
            kek.erase(kek.find({arr[l].y, l}));
            l++;
        }
        auto it = kek.lower_bound({arr[i].y - d, -inf});
        vector<point> have;
        while (it != kek.end() and it->first <= arr[i].y + d) {
            have.push_back(arr[it->second]);
            it++;
            if (have.size() >= 9 * k) {
                return true;
            }
        }
        if (can(have, d, arr[i])) {
            return true;
        }
    }
    return false;
}


void solve() {
    cin >> n >> k;
    arr.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i].x >> arr[i].y >> arr[i].k;
        arr[i].k %= k;
    }
    sort(all(arr), [&](point a, point b) {
        return mp(a.x, a.y) < mp(b.x, b.y);
    });
    ld l = 0, r = 1e9;
    while (r - l > EPS) {
        ld mid = (l + r) / 2.0;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid;
        }
    }
    cout << fixed << setprecision(3) << r;
}


int main() {
#ifndef LOCAL
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
#else
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    cout.precision(30);
    ll seed = time(0);
    //cerr << "Seed: " << seed << "\n";
    srand(seed);
    solve();
    return 0;
}

Compilation message

drzava.cpp: In function 'bool can(std::vector<point>&, long double, point)':
drzava.cpp:52:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < have.size(); i++) {
                     ~~^~~~~~~~~~~~~
drzava.cpp: In function 'bool check(long double)':
drzava.cpp:80:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if (have.size() >= 9 * k) {
                 ~~~~~~~~~~~~^~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Incorrect 2 ms 384 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 7 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 8 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 12 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 229 ms 3072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 783 ms 6452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 657 ms 6264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 384 KB Output is correct
2 Correct 713 ms 6728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 658 ms 6592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 644 ms 6648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 670 ms 6620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 649 ms 6744 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 608 ms 6624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -