Submission #789638

#TimeUsernameProblemLanguageResultExecution timeMemory
789638antonSelf Study (JOI22_ho_t2)C++17
100 / 100
345 ms13776 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
const int MAX_N = 3*1e5;

int n, m, A[MAX_N], B[MAX_N], C[MAX_N];

bool check(int target){
    //cout<<"target "<<target<<endl;
    for(int i = 0; i<n; i++){
        C[i] = A[i] * m;
    }
    int excess= 0;
    for(int i = 0; i<n; i++){
        if(C[i]>target){
            excess += (C[i]-target)/A[i];
            C[i]-= ((C[i]-target)/A[i])*A[i];
        }
    }

    for(int i = 0; i<n; i++){
        if(C[i]<target){
            int need = (target-C[i]+B[i]-1)/B[i];
            if(excess>=need){
                excess-=need;
            }
            else{
                return false;
            }
        }
    }
    return true;
}

signed main(){
    cin>>n>>m;

    for(int i = 0; i<n; i++){
        cin>>A[i];
    }

    for(int i = 0; i<n; i++){
        cin>>B[i];
        A[i] = max(A[i], B[i]);
    }

    int res= 0LL;

    for(int step = (1LL<<61LL); step>=1LL; step/=2LL){
        //cout<<"hello "<<step<<endl;
        if(check(res+step)){
            res+=step;
        }
    }
    cout<<res<<endl;
}
#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...