제출 #1032393

#제출 시각아이디문제언어결과실행 시간메모리
1032393Maite_MoraleA Difficult(y) Choice (BOI21_books)C++14
60 / 100
2 ms1112 KiB
    #include <bits/stdc++.h>
        
    #include "books.h"
        
    using namespace std;
    //
    // --- 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.
    //
        
    typedef long long ll ;
    #define vll vector<ll>
    #define vi vector<int>
     
    void solve(int n, int k, long long A, int S) {
        vll v(n+5,0);
        vi r={};
        ll s=0;
    ///*
        for(int i=1;i<=k;i++){
            r.push_back(i);
            v[i]=skim(i);
            s+=v[i];
           // cout<<"="<<s<<"\n";
            if(s>2*A){
                impossible();
                return;
            }
        }
       if(s>=A){
         answer(r);
         return;
       }
        ll last=n+1;
        for(int i=k;i>0;i--){
            s-=v[i];
            ll p=i,f=last;
          //  cout<<p<<" "<<f<<"\n";
            while(abs(p-f)!=1){
                ll md=(p+f)/2;
                if(v[md]==0)v[md]=skim(md);
                if(s+v[md]<A)p=md;
                else if(s+v[md]>2*A)f=md;
                        else{
                            r[i-1]=md;
                            answer(r);
                            return;
                        }   
              //  cout<<"="<<s<<"+"<<v[md]<<"\n";
            }//for(auto x : r)cout<<x<<" ";cout<<"\n";
            r[i-1]=p;   
            s+=v[p];
            last=p;
        }
    impossible();
    //*/
    /*
        for(int i=1;i<=n;i++){
            v[i]=skim(i);
            if(i<=k){
                s+=v[i];
                r.push_back(i);
              //  cout<<"="<<s<<"\n";
            }
        }
        if(s>2*A)impossible();
        //cout<<s<<"*-*\n";
        r.push_back(n+1);
     
        for(int i=k;i>0;i--){
            s-=v[i];
            for(int j=i;j<r[i];j++){
                if(s+v[j]>2*A)break;
                r[i-1]=j;
            }
            s+=v[r[i-1]];
        }
        r.pop_back();
        if(s>=A)answer(r);
        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...