Submission #1224643

#TimeUsernameProblemLanguageResultExecution timeMemory
1224643midiA Difficult(y) Choice (BOI21_books)C++20
10 / 100
3 ms1232 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; typedef long long ll; #define vc vector typedef vc<ll> vcll; #define pr pair typedef pr<ll,ll> prll; #define umap unordered_map #define fi first #define se second #define f0r(i,a,n) for ((i)=(a); (i)<=(n); (i)++) #define r0f(i,n,a) for ((i)=(a); (i)>=(a); (i)--) #define mp make_pair #define pb push_back #define ppb pop_back #define pf push_front #define ppf pop_front #define sz size #define mxN (100010ll) #define INF (LLONG_MAX-100ll) // skim(3); // impossible(); // answer({1,3}); ll n, k, A, A2, big; vcll ar(mxN,-1); inline ll peak (ll i) { return ar[i]==-1 ? skim(i) : ar[i]; } inline ll find_big() { ll l=1, r=n, big2=n+1; while (l<=r) { ll mid=(l+r)/2; if (peak(mid)>A) { big2=mid; r=mid-1; } else { l=mid+1; } } return big2; } inline vc<int> rng (vcll a, ll l, ll r) { vc<int> res; ll i; f0r(i,l,r) res.pb(a[i]); return res; } inline vc<int> normrng (ll l, ll r) { vc<int> res; ll i; f0r(i,l,r) res.pb(i); return res; } inline vc<int> merge (vc<int> a, vc<int> b) { vc<int> res; for (ll x:a) res.pb(x); for (ll x:b) res.pb(x); return res; } inline vc<int> bf (vc<int> inds1) { vcll inds; for (ll x:inds1) inds.pb(x); ll k1=inds.sz(); if (k1<k) return {}; vcll nums; nums.pb(-1); for (ll i:inds) nums.pb(peak(i)); ll s=0, i; f0r(i,1,k) s+=nums[i]; if (A<=s and s<=A2) return rng(inds,0,k-1); f0r(i,i,k1) { s += nums[i] - nums[i-k]; if (A<=s and s<=A2) return rng(inds,i-k,i-1); } return {}; } void solve(int N1, int K1, long long A1, int S1) { n=N1; k=K1; A=A1; A2=2*A; if (n<=S1) { vc<int> ans=bf(normrng(1,n)); if (ans.sz()) answer(ans); impossible(); } big=find_big(); if (big==n+1) { ar[big]=INF; } if (big==1) { if (peak(big<=A2) and k==1) answer({1}); impossible(); } if (big-1<=20) { vc<int> ans=bf(normrng(1,big-1)); if (ans.sz()) answer(ans); A-=peak(big); A2-=peak(big); if (A2<=0) impossible(); ans=bf(normrng(1,big-1)); // TODO if (ans.sz()) { ans.pb(big); answer(ans); } impossible(); } // edge cases vc<int> inds = merge(normrng(1,k), normrng(big-k,big-1)); vc<int> ans=bf(inds); if (ans.sz()) answer(ans); A-=peak(big); A2-=peak(big); if (A2<=0) impossible(); ans=bf(inds); if (ans.sz()) { ans.pb(big); answer(ans); } 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...