제출 #1038447

#제출 시각아이디문제언어결과실행 시간메모리
1038447HorizonWestA Difficult(y) Choice (BOI21_books)C++17
25 / 100
6 ms3668 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;

#pragma GCC optimize("O3")
#define endl '\n'
#define db double
#define ll long long
#define pb push_back
#define fs first
#define sd second
#define Mod long(1e9 + 7)
#define all(x) x.begin(), x.end()
#define unvisited long(-1)
#define Eps double(1e-9)
#define _for(i, n) for(int i = 0; i < (n); i++)
#define dbg(x) cout << #x ": " << x << endl;

const ll Inf = 1e18; 

//
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
//     books.h books_sample.cpp sample_grader.cpp
// in a single folder and run:
//     g++ books_sample.cpp sample_grader.cpp
// in this folder.
//
bool check(ll sum, ll a){
    return (sum >= a && sum <= 2*a); 
}

pair<int, int> find(vector <ll> v, ll x, ll y){
    int n = v.size()-1, l = n+1, r = 0; 
    vector <pair<ll, ll>> s(n+2, { 0, Inf });
    for(int i = 1; i <= n; i++){
        s[i].fs = s[i-1].fs; 
        if(v[i] != -1){
            s[i].fs = v[i]; 
        }
    }

    for(int i = n; i >= 1; i--){
        s[i].sd = s[i-1].sd; 
        if(v[i] != -1){
            s[i].sd = v[i]; 
        }
    }

    for(int i = 1; i <= n; i++){
        if(y >= s[i].fs && s[i].sd >= x){
            l = min(l, i); 
            r = max(r, i); 
        }
    }

    return { l, r+1 }; 
}

void solve(int n, int k, long long a, int s) 
{
    vector <ll> v(n+1, -1);
    vector <int> ans;
    ll sum = 0; 

    for(int i = 1; i <= k; i++){
        v[i] = skim(i);
        ans.push_back(i); 
        sum += v[i]; 
    }

    if(sum > 2*a){
        impossible(); 
        return;
    }else if(check(sum, a)){
        answer(ans); 
        return;
    }

    int last = n+1; 

    for(auto& u : ans)
    {
        pair <int, int> t = find(v, v[u]+1, 2*a-sum+v[u]);  
        int l = max(t.fs, k+1), r = min(t.sd, last);  
        if(l > r) break;
        while (abs(l - r) != 1)
        {
            int mid = (l + r) / 2;  

            if(v[mid] == -1){
                v[mid] = skim(mid);
            }

            ll tmp = sum + (v[mid] - v[0]);
            if(tmp >= sum && tmp <= 2*a)
                l = mid; 
            else 
                r = mid; 
        }

        if(v[l] > v[u]){
            sum = sum + (v[l] - v[u]);
            u = l; 
            last = u; 
        }
    }

    if(check(sum, a))
        answer(ans); 
    else 
        impossible(); 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...