제출 #901036

#제출 시각아이디문제언어결과실행 시간메모리
901036simona1230A Difficult(y) Choice (BOI21_books)C++17
20 / 100
128 ms1512 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; long long n,k,a,s; long long x[120001]; void know_all() { for(long long i=1; i<=n; i++) { x[i]=skim(i); } long long fk=0,fs=0,fsidx=0; for(int i=1; i<=n; i++) { if(i<k)fk+=x[i]; if(x[i]>=a) { fs=x[i]; fsidx=i; break; } } if(fs+fk>=a&&fs+fk<=2*a) { vector<int> ans; for(int i=1; i<k; i++) ans.push_back(i); ans.push_back(fsidx); answer(ans); return; } long long sum=0; for(int i=1; i<=n; i++) { sum+=x[i]; if(i>k)sum-=x[i-k]; if(i>=k&&sum>=a&&sum<=2*a) { vector<int> ans; for(int j=i-k+1; j<=i; j++) ans.push_back(j); answer(ans); return; } } impossible(); } long long val(int idx) { if(x[idx]==0)x[idx]=skim(idx); return x[idx]; } void solve(int N,int K,long long A,int S) { n=N; k=K; a=A; s=S; if(s==n) { know_all(); return; } int lidx=1,ridx=n,idx=0; while(lidx<=ridx) { int m=(lidx+ridx)/2; if(val(m)>=a) { idx=m; ridx=m-1; } else lidx=m+1; } if(idx!=0) { long long fk=0; for(int i=1; i<k; i++) fk+=val(i); if(fk+val(idx)>=a&&fk+val(idx)<=2*a) { vector<int> ans; for(int i=1; i<k; i++) ans.push_back(i); ans.push_back(idx); answer(ans); return; } } long long sum=0; for(int i=1;i<=k;i++) sum+=val(i); int lf=k,rt=idx-1; while(lf>=1&&sum<a) { sum-=val(lf--); sum+=val(rt--); if(sum>=a&&sum<=2*a) { vector<int> ans; for(int i=1;i<=lf;i++) ans.push_back(i); for(int i=rt+1;rt<idx;rt++) ans.push_back(i); 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...