답안 #112439

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
112439 2019-05-19T19:29:46 Z Frankenween Drzava (COCI15_drzava) C++17
128 / 160
1000 ms 8828 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;


struct dsu {
    vector<ll> pr, sz, mask;

    dsu() {
        pr.resize(n);
        sz.resize(n, 1);
        mask.resize(n);
        for (int i = 0; i < n; i++) {
            pr[i] = i;
            mask[i] = (1LL << arr[i].k);
        }
    }

    ll lead(ll x) {
        if (pr[x] == x) {
            return x;
        }
        pr[x] = lead(pr[x]);
        return pr[x];
    }

    void unite(ll a, ll b) {
        a = lead(a);
        b = lead(b);
        if (a == b) {
            return;
        }
        if (sz[a] < sz[b]) {
            swap(a, b);
        }
        pr[b] = a;
        sz[a] += sz[b];
        for (int i = 0; i < k; i++) {
            if (mask[b] & (1LL << i)) {
                mask[a] |= ((mask[a] << i) | (1LL << i));
                mask[a] |= (mask[a] >> k);
                mask[a] &= (1 << k) - 1;
            }
        }
    }

    ll size(ll x) {
        return sz[lead(x)];
    }

    bool keks(ll x) {
        x = lead(x);
        if (sz[x] >= 9 * k) {
            return true;
        }

        return (mask[x] & 1);
    }
};


bool check(ld d) {
    ll l = 0, r = -1;
    multiset<pair<ld, ll>> kek;
    dsu ggwp;
    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});
        ll cnt = 0;
        while (it != kek.end() and it->first <= arr[i].y + d) {
            cnt++;
            if (cnt >= 9 * k) {
                return true;
            }
            if (it->second != i and dist(arr[it->second], arr[i]) <= d) {
                ggwp.unite(i, it->second);
            }
            it++;
        }
    }
    for (int i = 0; i < n; i++) {
        if (ggwp.keks(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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 16 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 14 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 11 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 16 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 16 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 9 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 302 ms 3700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Execution timed out 1073 ms 8668 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Execution timed out 1074 ms 7548 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 979 ms 7388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Execution timed out 1072 ms 7900 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Execution timed out 1034 ms 8796 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 866 ms 7960 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 966 ms 7856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 889 ms 7856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 889 ms 8028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 940 ms 8048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 844 ms 8828 KB Output is correct