답안 #1027968

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1027968 2024-07-19T12:04:51 Z GrindMachine Seesaw (JOI22_seesaw) C++17
100 / 100
361 ms 62136 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;

template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) (int)a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x,y) ((x+y-1)/(y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl

#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep1(i,n) for(int i = 1; i <= n; ++i)
#define rev(i,s,e) for(int i = s; i >= e; --i)
#define trav(i,a) for(auto &i : a)

template<typename T>
void amin(T &a, T b) {
    a = min(a,b);
}

template<typename T>
void amax(T &a, T b) {
    a = max(a,b);
}

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

/*

refs:
https://www.luogu.com.cn/blog/gyh20/joi-open-2022-ti-xie

*/

const int MOD = 1e9 + 7;
const int N = 1e5 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;

struct frac{
    __int128 a,b;
    frac(ll a_, ll b_){
        a = a_, b = b_;
    }
    bool operator<(const frac &f) const{
        return a*f.b < b*f.a;
    }
    bool operator>(const frac &f) const{
        return a*f.b > b*f.a;
    }
    frac operator-(const frac &f){
        auto [a2,b2] = f;
        return frac(a*b2-a2*b,b*b2);
    }
};

void solve(int test_case)
{
    ll n; cin >> n;
    vector<ll> a(n+5);
    rep1(i,n) cin >> a[i];

    vector<ll> p(n+5);
    rep1(i,n) p[i] = p[i-1]+a[i];

    frac g(p[n],n);
    vector<pair<frac,ll>> b;

    rep1(len,n-1){
        ll lo = 1, hi = n-len+1;         
        ll pos = 0;
        while(lo <= hi){
            ll mid = (lo+hi) >> 1;
            ll s = p[mid+len-1]-p[mid-1];
            frac f(s,len);
            if(f < g){
                pos = mid;
                lo = mid+1;
            }
            else{
                hi = mid-1;
            }
        }

        for(int i = pos; i <= pos+1; ++i){
            if(i < 1 or i+len-1 > n) conts;
            ll s = p[i+len-1]-p[i-1];
            frac f(s,len);
            b.pb({f,len});
        }
    }

    b.pb({g,n});
    sort(all(b));
    vector<frac> here[n+5];
    reverse(all(b));
    for(auto [f,len] : b){
        here[len].pb(f);
    }
    reverse(all(b));

    set<frac> st;
    rep1(len,n){
        st.insert(here[len].back());
    }

    frac best(inf2,1);

    for(auto [f,len] : b){
        auto mx = *st.rbegin();
        auto diff = mx-f;
        if(diff < best) best = diff;

        here[len].pop_back();
        if(here[len].empty()) break;
        st.erase(f);
        st.insert(here[len].back());
    }

    ld ans = (ld)best.a/best.b;
    cout << fixed << setprecision(11);
    cout << ans << endl;

    /*

    frac best(inf2,1);

    rep(mask,1<<(n-1)){
        frac mn = g, mx = g;
        bool ok = true;

        rep1(len,n-1){
            ll i = 0;
            if(mask&(1<<(len-1))){
                i = b[len]+1;
            }
            else{
                i = b[len];
            }

            if(i < 1 or i+len-1 > n){
                ok = false;
                break;
            }

            frac f(p[i+len-1]-p[i-1],len);
            if(f < mn) mn = f;
            if(f > mx) mx = f;
        }

        if(!ok) conts;
        frac res = mx-mn;
        if(res < best) best = res;
    }

    ld ans = (ld)best.a/best.b;
    cout << fixed << setprecision(11);
    cout << ans << endl;

    */
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;

    rep1(i, t) {
        solve(i);
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 2 ms 864 KB Output is correct
9 Correct 3 ms 864 KB Output is correct
10 Correct 2 ms 1052 KB Output is correct
11 Correct 3 ms 796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 2 ms 864 KB Output is correct
9 Correct 3 ms 864 KB Output is correct
10 Correct 2 ms 1052 KB Output is correct
11 Correct 3 ms 796 KB Output is correct
12 Correct 361 ms 60480 KB Output is correct
13 Correct 350 ms 62136 KB Output is correct
14 Correct 338 ms 61112 KB Output is correct
15 Correct 341 ms 61104 KB Output is correct
16 Correct 345 ms 61256 KB Output is correct