제출 #1019222

#제출 시각아이디문제언어결과실행 시간메모리
1019222ThanhsAliens (IOI16_aliens)C++14
컴파일 에러
0 ms0 KiB
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define double long double
#define pb push_back
 
#define endl '\n'
#define fastIO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define setmin(x,y) x=min((x),(y))
#define setmax(x,y) x=max((x),(y))
#define fi first
#define se second
 
mt19937 hdp(chrono::high_resolution_clock::now().time_since_epoch().count());
int rand(int l,int r){return l+((hdp()%(r-l+1))+r-l+1)%(r-l+1);}

const int N = 2e5 + 5;
const int mod = 1e9 + 7;
const int SQ = 450;
const int inf = 1e18;
const int bound = 1e7;

struct line
{
    int m = 0, b = inf;
    int operator()(int x){return m * x + b;}
};

struct node
{
    line ln;
    int trace = 0;
    node* lc = nullptr;
    node* rc = nullptr;
    int operator()(int x){return ln(x);}
    node(){}
};

node* root = nullptr;

void upd(line nw, int tr, node* cur = root, int l = 0, int r = bound)
{
    if (l > r) return;
    int m = l + r >> 1;
    bool b1 = ((*cur)(l) > nw(l)), b2 = ((*cur)(m) > nw(m));
    if(b2) 
    {
        swap(cur -> ln, nw);
        swap(cur -> trace, tr);
    }
    if(b1 != b2)
    {
        if (! cur -> lc) cur -> lc = new node();
        upd(nw, tr, cur -> lc, l, m - 1);
    }
    else
    {
        if (! cur -> rc) cur -> rc = new node();
        upd(nw, tr, cur -> rc, m + 1, r);
    }
}

pair<int, int> query(int x, node* cur = root, int l = 0, int r = bound)
{
    if (l > r) return {inf, -1};
    int m = l + r >> 1;
    pair<int, int> res = {(*cur)(x), cur -> trace};
    if (x == m) res;
    if(x < m)
    {
        if (! cur -> lc) return res;
        return min(query(x, cur -> lc, l, m - 1), res);
    }
    else
    {
        if (! cur -> rc) return res;
        return min(query(x, cur -> rc, m + 1, r), res);
    }
}

void del(node* cur = root)
{
    if(cur -> lc) del(cur -> lc);
    if(cur -> rc) del(cur -> rc);
    delete(cur);
}

int n;
pair<int, int> C[N];
deque<int> st;

pair<int, int> solve(int x)
{
    if(root) del();
    root = new node();
    upd({- 2 * C[1].fi, - 2 * C[1].fi + C[1].fi * C[1].fi}, 0);
    for (int i = 1; i <= n; i++)
    {
        pair<int,int> res = query(C[i].se);
        res.fi += C[i].se * C[i].se + 2 * C[i].se + 1 + x;
        res.se++;
        if (i == n) return res;
        upd({-2 * C[i + 1].fi, res.fi - 2 * C[i + 1].fi + C[i + 1].fi * C[i + 1].fi - max(C[i].fi - C[i + 1].fi + 1, 0ll) * max(C[i].se - C[i + 1].fi + 1, 0ll)}, res.se);
    }
}

int take_photos(int32_t _n, int32_t m, int32_t k, array<int32_t> x, array<int32_t> y)
{
    n = _n;
    for (int i = 1; i <= n; i++) {
        C[i].fi = x[i - 1];
        C[i].se = y[i - 1];
        if(C[i].fi > C[i].se) swap(C[i].fi, C[i].se);
    }
    sort(C + 1, C + 1 + n, [&](pair<int, int> x, pair<int, int> y) {
        return make_pair(x.se, x.fi) < make_pair(y.se, y.fi);
    });
    st.push_back(1);
    for (int i = 2; i <= n; i++)
    {
        while (! st.empty() && C[st.back()].fi >= C[i].fi) st.pop_back();
        st.push_back(i);
    }
    n = 0;
    while (!st.empty())
    {
        C[++n] = C[st.front()];
        st.pop_front();
    }
    int l = -1, r = n * n + 1;
    while (l < r - 1)
    {
        int m = l + r >> 1;
        auto res = solve(m);
        if (res.se > k) l = m;
        else r = m;
    }
    auto res = solve(r);
    return res.fi - res.se * r;
}

// signed main()
// {
//     fastIO
//     freopen("in.txt","r",stdin);
//     freopen("out.txt","w",stdout);
//     cin >> n >> m >> k;
//     for (int i = 1; i <= n; i++) {
//         cin >> C[i].fi >> C[i].se;
//         if(C[i].fi > C[i].se) swap(C[i].fi, C[i].se);
//     }
//     sort(C + 1, C + 1 + n, [&](pair<int, int> x, pair<int, int> y) {
//         return make_pair(x.se, x.fi) < make_pair(y.se, y.fi);
//     });
//     st.push_back(1);
//     for (int i = 2; i <= n; i++)
//     {
//         while (! st.empty() && C[st.back()].fi >= C[i].fi) st.pop_back();
//         st.push_back(i);
//     }
//     n = 0;
//     while (!st.empty())
//     {
//         C[++n] = C[st.front()];
//         st.pop_front();
//     }
//     int l = -1, r = n * n + 1;
//     while (l < r - 1)
//     {
//         int m = l + r >> 1;
//         auto res = solve(m);
//         if (res.se > k) l = m;
//         else r = m;
//     }
//     auto res = solve(r);
//     cout << res.fi - res.se * r;
// }

컴파일 시 표준 에러 (stderr) 메시지

aliens.cpp: In function 'void upd(line, long long int, node*, long long int, long long int)':
aliens.cpp:46:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |     int m = l + r >> 1;
      |             ~~^~~
aliens.cpp: In function 'std::pair<long long int, long long int> query(long long int, node*, long long int, long long int)':
aliens.cpp:68:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   68 |     int m = l + r >> 1;
      |             ~~^~~
aliens.cpp:70:17: warning: statement has no effect [-Wunused-value]
   70 |     if (x == m) res;
      |                 ^~~
aliens.cpp: At global scope:
aliens.cpp:109:64: error: wrong number of template arguments (1, should be 2)
  109 | int take_photos(int32_t _n, int32_t m, int32_t k, array<int32_t> x, array<int32_t> y)
      |                                                                ^
In file included from /usr/include/c++/10/tuple:39,
                 from /usr/include/c++/10/functional:54,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:71,
                 from aliens.cpp:3:
/usr/include/c++/10/array:94:12: note: provided for 'template<class _Tp, long unsigned int _Nm> struct std::array'
   94 |     struct array
      |            ^~~~~
aliens.cpp:109:82: error: wrong number of template arguments (1, should be 2)
  109 | int take_photos(int32_t _n, int32_t m, int32_t k, array<int32_t> x, array<int32_t> y)
      |                                                                                  ^
In file included from /usr/include/c++/10/tuple:39,
                 from /usr/include/c++/10/functional:54,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:71,
                 from aliens.cpp:3:
/usr/include/c++/10/array:94:12: note: provided for 'template<class _Tp, long unsigned int _Nm> struct std::array'
   94 |     struct array
      |            ^~~~~
aliens.cpp: In function 'long long int take_photos(int32_t, int32_t, int32_t, int, int)':
aliens.cpp:113:20: error: invalid types 'int[long long int]' for array subscript
  113 |         C[i].fi = x[i - 1];
      |                    ^
aliens.cpp:114:20: error: invalid types 'int[long long int]' for array subscript
  114 |         C[i].se = y[i - 1];
      |                    ^
aliens.cpp:135:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  135 |         int m = l + r >> 1;
      |                 ~~^~~
aliens.cpp: In function 'std::pair<long long int, long long int> solve(long long int)':
aliens.cpp:107:1: warning: control reaches end of non-void function [-Wreturn-type]
  107 | }
      | ^