Submission #1365606

#TimeUsernameProblemLanguageResultExecution timeMemory
1365606julia_08A Difficult(y) Choice (BOI21_books)C++20
60 / 100
1 ms1184 KiB
#include <bits/stdc++.h>
#include "books.h"

using namespace std;
using ll = long long;

const int MAXN = 1e5 + 10;

ll x[MAXN];

ll get(int i){
  if(!x[i]) x[i] = skim(i);
  return x[i];
}

ll get_sum(int m, int k){

  ll sum = 0;

  for(int i=m; i<=(m + k - 1); i++){

    if(!x[i]) x[i] = skim(i);
    sum += x[i];

  }

  return sum;

}

void solve(int n, int k, ll a, int s){

  for(int i=1; i<=n; i++) x[i] = 0;

  int l = 1, r = n;

  while(l < r){

    int m = l + (r - l) / 2;

    if(get(m) > a) r = m;
    else l = m + 1;

  }

  vector<int> ans;

  if(k - 1 < r && a <= get_sum(1, k - 1) + get(r) && get_sum(1, k - 1) + get(r) <= 2 * a){

    for(int i=1; i<=(k - 1); i++) ans.push_back(i);
    ans.push_back(r);

    answer(ans);
    return;

  }

  if(a <= get_sum(1, k) && get_sum(1, k) <= 2 * a){

    for(int i=1; i<=k; i++) ans.push_back(i);

    answer(ans);
    return;

  }

  if(r - k >= 1 && a <= get_sum(r - k, k) && get_sum(r - k, k) <= 2 * a){

    for(int i=(r - k); i<=(r - 1); i++) ans.push_back(i);

    answer(ans);
    return;

  }

  ll sum = 0;

  int lx = k, rx = r;

  for(int i=1; i<=k; i++) sum += get(i);

  while(lx >= 1 && lx < rx && sum < a){

    sum += get(rx--);
    sum -= get(lx--);

  }

  for(int i=1; i<=lx; i++) ans.push_back(i);
  for(int i=(rx + 1); i<=r; i++) ans.push_back(i);

  if((int) ans.size() == k && a <= sum && sum <= 2 * a){
    answer(ans);
    return;
  }

  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...