제출 #409118

#제출 시각아이디문제언어결과실행 시간메모리
409118pliam선물상자 (IOI15_boxes)C++14
100 / 100
912 ms415784 KiB
#include "boxes.h" #include <bits/stdc++.h> using namespace std; #define MAXN 10000005 typedef long long ll; ll pos[2*MAXN]; ll dp_init[2*MAXN]; deque<pair<int,ll>> min_q; int n,k; ll l; ll ans,extra,dp_s; ll min_(){ return min_q.front().second; } void insert_q(pair<int,ll> p){ while(!min_q.empty()&&p.second<min_q.back().second) min_q.pop_back(); min_q.push_back(p); } void erase_q(int x){ if(!min_q.empty()&&min_q.front().first==x) min_q.pop_front(); } ll dist(ll x){ return min(x,l-x); } int modn(int i){ return (i<=n)?i:(i-n); } ll c(int i){ return dist(pos[modn(i)])+pos[i]; } ll d(int i){ return dist(pos[modn(i+1)])-pos[i+1]; } long long delivery(int N, int K, int L, int positions[]) { n=N; k=K; l=L; if(N==1){ return 2*dist(positions[0]); } for(int i=1;i<=n;i++){ pos[i]=positions[i-1]; } for(int i=n+1;i<=2*n;i++){ pos[i]=pos[i-n]+l; } dp_init[0]=0; insert_q({0,dp_init[0]+d(0)});//base case for(int i=1;i<=2*n-1;i++){ erase_q(i-k-1); dp_init[i]=min_()+c(i); insert_q({i,dp_init[i]+d(i)}); } /* ans=dp_init[n]; extra=0; dp_s=dp_init[1]; for(int s=2;s<=n;s++){ extra+=(-dp_s); dp_s=dp_init[s]+extra; ans=min(ans,dp_init[s+n-1]+extra); } */ return dp_init[n]; }
#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...