Submission #939551

#TimeUsernameProblemLanguageResultExecution timeMemory
939551LucaIlieA Difficult(y) Choice (BOI21_books)C++17
100 / 100
1 ms1116 KiB
#include <bits/stdc++.h>

#include "books.h"

using namespace std;

const int MAX_N = 1e5;
long long difficulty[MAX_N + 1];
int n, m, k, q;
long long a;

long long d( int i ) {
    if ( difficulty[i] == 0 )
        difficulty[i] = skim( i );
    return difficulty[i];
}

void findM() {
    int l = 0, r = n + 1;
    while ( r - l > 1 ) {
        int mid = (l + r) / 2;

        if ( d( mid ) >= a )
            r = mid;
        else
            l = mid;
    }
    m = l;
}

void checkLarge() {
    if ( m != n ) {
        long long s = d( m + 1 );
        vector<int> ans;
        ans.push_back( m + 1 );
        for ( int i = 1; i < k; i++ ) {
            s += d( i );
            ans.push_back( i );
        }
        if ( s <= 2 * a ) {
            answer( ans );
            return;
        }
    }
}

void solve( int N, int K, long long A, int Q ) {
    n = N;
    k = K;
    a = A;
    q = Q;

    findM();
    if ( m == 0 ) {
        impossible();
        return;
    }
    checkLarge();
    if ( m < k ) {
        impossible();
        return;
    }

    for ( int p = 0; p <= k; p++ ) {
        vector<int> ans;
        long long s = 0;
        for ( int i = 1; i <= p; i++ ) {
            s += d( i );
            ans.push_back( i );
        }
        for ( int i = m; i >= m - (k - p) + 1; i-- ) {
            s += d( i );
            ans.push_back( i );
        }

        if ( a <= s && s <= 2 * a ) {
            answer( ans );
            return;
        }
    }
    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...