Submission #1325081

#TimeUsernameProblemLanguageResultExecution timeMemory
1325081StefanSebez선물상자 (IOI15_boxes)C++20
100 / 100
526 ms174184 KiB
#include "boxes.h"
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
template<typename T1,typename T2>void chmn(T1 &x,const T2 &y){x=x<y?x:y;}
template<typename T1,typename T2>void chmx(T1 &x,const T2 &y){x=x>y?x:y;}
const ll N=1e7+50,INF=1e18;
int n,K,L,p[N];
struct SlidingMin{
    deque<ll>dq;
    queue<ll>a;
    void push(ll x){
        a.push(x);
        while(!dq.empty()&&dq.back()>x)dq.pop_back();
        dq.push_back(x);
    }
    void pop(){
        ll x=a.front();
        a.pop();
        if(!dq.empty()&&x==dq.front())dq.pop_front();
    }
    ll Min(){
        if(dq.empty())return INF;
        return dq.front();
    }
    bool Empty(){return a.empty();}
}SD[2];
ll delivery(int _n, int _K, int _L, int _p[]) {
    n=_n,K=_K,L=_L;
    for(int i=1;i<=n;i++)p[i]=_p[i-1];
    sort(p+1,p+n+1);
    ll dp[n+5]={0};
    for(int j=1,i=1;i<=n;i++){
        dp[i]=INF;
        SD[1].push(dp[i-1]+L-p[i]+min(p[i],L-p[i]));
        while(j<=i&&L-p[j]+min(p[j],L-p[j])>=p[i]+min(p[i],L-p[i])){
            SD[0].push(dp[j-1]);
            SD[1].pop();
            j++;
        }
        while(j<i-K){
            SD[1].pop();
            j++;
        }
        if(i-K>=1){
            if(!SD[0].Empty())SD[0].pop();
            else if(!SD[1].Empty()) SD[1].pop(),j++;
        }
        chmn(dp[i],SD[0].Min()+p[i]+min(p[i],L-p[i]));
        chmn(dp[i],SD[1].Min());
    }
    ll res=dp[n];
    return res;
}
#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...