답안 #646227

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
646227 2022-09-29T09:12:23 Z pls33 Mobile (BOI12_mobile) C++17
0 / 100
633 ms 27472 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
    
using namespace std;
using namespace __gnu_pbds;
    
#pragma region dalykai
using p32 = pair<int, int>;
using p32u = pair<uint32_t, uint32_t>;
using p64 = pair<int64_t, int64_t>;
using p64u = pair<uint64_t, uint64_t>;
using vi16 = vector<int16_t>;
using vi16u = vector<uint16_t>;
using vi32 = vector<int>;
using vi32u = vector<uint32_t>;
using vi64 = vector<int64_t>;
using vi64u = vector<uint64_t>;
using vp32 = vector<p32>;
using vp32u = vector<p32u>;
using vp64 = vector<p64>;
using vp64u = vector<p64u>;
using vvi32 = vector<vi32>;
using vvi32u = vector<vi32u>;
using vvi64 = vector<vi64>;
using vvi64u = vector<vi64u>;
using vvp32 = vector<vp32>;
using vvp32u = vector<vp32u>;
using vvp64 = vector<vp64>;
using vvp64u = vector<vp64u>;
    
using pf32 = pair<float, float>;
using pf64 = pair<double, double>;
using pf80 = pair<long double, long double>;
using vf32 = vector<float>;
using vf64 = vector<double>;
using vf80 = vector<long double>;
using vpf32 = vector<pf32>;
using vpf64 = vector<pf64>;
using vpf80 = vector<pf80>;
using vvf32 = vector<vf32>;
using vvf64 = vector<vf64>;
using vvf80 = vector<vf80>;
using vvpf32 = vector<vpf32>;
using vvpf64 = vector<vpf64>;
using vvpf80 = vector<vpf80>;
    
template <typename key, typename val>
using ord_map = tree<key, val, less<key>, rb_tree_tag,
                        tree_order_statistics_node_update>;
    
template <typename key>
using ord_set = tree<key, null_type, less<key>, rb_tree_tag,
                        tree_order_statistics_node_update>;
    
const int BUF_SZ = 1 << 15;
inline namespace fast_in
{
    char buf[BUF_SZ];
    int pos;
    int len;
    
    char next_char(FILE *f)
    {
        if (pos == len)
        {
            pos = 0;
            len = (int)fread(buf, 1, BUF_SZ, f);
    
            if (!len)
            {
                return EOF;
            }
        }
    
        return buf[pos++];
    }
    
    int read_int(FILE *f)
    {
        int x;
        char ch;
        int sgn = 1;
    
        while (!isdigit(ch = next_char(f)))
        {
            if (ch == '-')
            {
                sgn *= -1;
            }
        }
    
        x = ch - '0';
        while (isdigit(ch = next_char(f)))
        {
            x = x * 10 + (ch - '0');
        }
    
        return x * sgn;
    }
}
    
/**
 * @brief gale programos flush_out kviest!!
 */
inline namespace fast_out
{
    char buf[BUF_SZ];
    int pos;
    
    void flush_out(FILE *f)
    {
        fwrite(buf, 1, pos, f);
        pos = 0;
    }
    
    void write_char(char c, FILE *f)
    {
        if (pos == BUF_SZ)
        {
            flush_out(f);
        }
    
        buf[pos++] = c;
    }
    
    void write_int(int x, FILE *f)
    {
        static char num_buf[100];
    
        if (x < 0)
        {
            write_char('-', f);
            x *= -1;
        }
    
        int len = 0;
        for (; x >= 10; x /= 10)
        {
            num_buf[len++] = (char)('0' + (x % 10));
        }
    
        write_char((char)('0' + x), f);
        while (len)
        {
            write_char(num_buf[--len], f);
        }
        write_char('\n', f);
    }
}
#pragma endregion

using fl_t = long double;
const fl_t __eps = 1e-3; 

struct line_t
{
    int64_t m, c;
    long long eval(long long x) const { return m * x + c; }
    fl_t eval_fl(fl_t x) const { return m * x + c; }
    
    fl_t intersect(line_t line){
        fl_t diff_c = c - line.c;
        fl_t diff_m = line.m - m;

        return diff_c / diff_m;
    }
};

fl_t equal(fl_t a, fl_t b){
    return fabsl(a - b) < __eps;
}

struct cht_t
{
    deque<line_t> hull;
    vector<fl_t> ints;
    function<bool(int, int)> compare;

    cht_t(int size): ints(size, 0.0)
    {
        iota(ints.begin(), ints.end(), 0.0);
        //hull.push_front({0, 0});

        compare = [this](int index, int x){
            return this->hull[index].intersect(this->hull[index + 1]) < x;
        };
    }
    
    void add(int64_t m, int64_t c){
        line_t line = {m, c};

        fl_t int_a = line.intersect(hull[0]);
        fl_t int_b = hull[0].intersect(hull[1]);

        while(hull.size() >= 2 && ((int_a > int_b) || equal(int_a, int_b))){
            hull.pop_front();
        }

        hull.push_front(line);
    }

    fl_t query(fl_t x){

        int index = *lower_bound(ints.begin(), ints.begin() + hull.size() - 1, x, compare);
        return hull[index].eval_fl(x);
    }
};
    
void add(p32 a, cht_t &cht)
{
    int64_t m = -2ll * a.first;
    int64_t c = (int64_t)a.first * a.first + (int64_t)a.second * a.second;
    
    cht.add(-m, -c);
}

fl_t query(fl_t x, cht_t &cht){
    return -cht.query(x) + x * x;
}

fl_t ternary_search(fl_t l, fl_t r, cht_t &cht){
    while(r - l > __eps){
        fl_t m1 = l + (r - l) / 3;
        fl_t m2 = r - (r - l) / 3;

        if(query(m1, cht) < query(m2, cht)){
            l = m1;
        }
        else {
            r = m2;
        }
    }

    return query(l, cht);
}
    
int main()
{
    //freopen("mobile.in", "r", stdin);
    
    int n, length;
    cin >> n >> length;
    
    vp32 station(n);
    
    cht_t cht(n);
    for (auto &s : station)
    {
        cin >> s.first >> s.second;
    
        add(s, cht);
    }
    
    cout << sqrt(ternary_search(0.0, length, cht)) << '\n';
    
    return 0;
}

Compilation message

mobile.cpp:8: warning: ignoring '#pragma region dalykai' [-Wunknown-pragmas]
    8 | #pragma region dalykai
      | 
mobile.cpp:151: warning: ignoring '#pragma endregion ' [-Wunknown-pragmas]
  151 | #pragma endregion
      |
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 308 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 39 ms 2764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 37 ms 2768 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 39 ms 3036 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 67 ms 4164 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 64 ms 4164 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 246 ms 15664 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 335 ms 15824 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 262 ms 18048 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 392 ms 18156 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 292 ms 20428 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 451 ms 20224 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 339 ms 22712 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 515 ms 22600 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 433 ms 27472 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 633 ms 24036 KB Output isn't correct
2 Halted 0 ms 0 KB -