Submission #1368422

#TimeUsernameProblemLanguageResultExecution timeMemory
1368422maya_sA Difficult(y) Choice (BOI21_books)C++20
60 / 100
0 ms424 KiB
#include <bits/stdc++.h>
#include "books.h"

using namespace std;
typedef long long ll;
const ll SIZE = 100100;
ll value[SIZE];

ll do_skim(ll x){
    if(!value[x]) value[x] = skim(x);
    return value[x];
}

ll find_a_idx(ll n, ll a){
    ll lo = 1, hi = n+1;
    while(lo < hi){
        ll mid = (lo + hi) / 2;
        if(do_skim(mid) >= a) hi = mid;
        else lo = mid+1;
    }
    return lo;
}

ll max_cost(ll x, ll n){
    if(n == 0) return 0;
    return x*(x+1) / 2 - (x-n)*(x-n+1) / 2;
}

ll subarray_sum(ll i, ll j, ll a){
    ll sum = 0;
    for(ll t = j; t >= i; t--){
        sum += do_skim(t);
        if(sum > 2*a || (sum == 2*a && t > i)) return 2*a+1;
        if(sum + max_cost(do_skim(t)-1, t-i) < a) return a-1;
    }
    return sum;
}

ll find_range(ll n, ll k, ll a){
    ll lo = k, hi = n;
    while(lo < hi){
        ll mid = (lo + hi)/2, sum = subarray_sum(mid-k+1, mid, a);
        if(sum >= a && sum <= 2*a) return mid;
        if(sum > 2*a) hi = mid-1;
        else if(sum < a) lo = mid+1;
    }
    return -1;
}

void solve(int N, int K, long long A, int S) {
    ll n = N, k = K, a = A, s = S;
    ll a_idx = find_a_idx(n, a);
    if(a_idx != n+1){
        ll a_sum = do_skim(a_idx);
        for(ll i = k-1; a_sum <= 2*a && i > 0; i--){
            a_sum += do_skim(i);
        }
        if(a_sum <= 2*a){
            vector<int> ans = {(int)a_idx};
            for(ll i = 1; i < k; i++) ans.push_back(i);
            answer(ans);
        }
    }
    ll a_over_k_idx = find_a_idx(n, (a + (a % k)) / k);
    a_over_k_idx = max(a_over_k_idx, k);
    for(ll i = a_over_k_idx - k + 1; i < a_over_k_idx; i++){
        ll sum = subarray_sum(i, i+k-1, a);
        if(sum >= a && sum <= 2*a) {
            vector<int> ans;
            for(ll j = i; j <= i+k-1; j++) ans.push_back(j);
            return answer(ans);
        }
    }
    impossible();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...