제출 #63304

#제출 시각아이디문제언어결과실행 시간메모리
63304hamzqq9선물상자 (IOI15_boxes)C++14
0 / 100
3 ms404 KiB
#include<bits/stdc++.h> #include "boxes.h" using namespace std; #define MAX 1000006 #define ll long long #define umin(x,y) x=min(x,y) #define umax(x,y) x=max(x,y) #define inf 100000000000000000 int Left[MAX],Right[MAX]; ll sumR[MAX],sumL[MAX]; long long delivery(int N, int K, int L, int P[]) { int curL=0,curR=0; int pro=0; for(int i=0;i<N;i++) { if(P[i]==0) continue ; if(P[i]<=(L-1)/2) { Left[curL++]=P[i]; } else if(P[i]>=(L%2?(L+1)/2:L/2+1)) { Right[curR++]=P[i]; } else { pro++; } } // printf("PRO-->%d\n",pro); // printf("curL-->%d curR-->%d\n",curL,curR); for(int i=0;i<curR;i++) { if(i-K>=0) sumR[i]=sumR[i-K]+(L-Right[i])*2; else sumR[i]=(L-Right[i])*2; } for(int i=0;i<curL;i++) { if(i-K>=0) sumL[i]=sumL[i-K]+Left[i]*2; else sumL[i]=Left[i]*2; } for(int i=0;i<curL;i++) { // printf("sumL[%d]-->%lld\n",i,sumL[i]); // printf("Left[%d]-->%d\n",i,Left[i]); } for(int i=0;i<curR;i++) { // printf("sumR[%d]-->%lld\n",i,sumR[i]); // printf("Right[%d]-->%d\n",i,Right[i]); } ll ans=(pro+K-1)/K*L; // printf("FIRST ANS-->%lld\n",ans); int rem=(pro?K-pro%K:0); ll add=inf; for(int i=0;i<=(N-pro+K-1)/K;i++) { int use=min(rem+i*K,N-pro); ll cev=inf; for(int j=0;j<=use;j++) { umin(cev,(curR-1-j>=0?sumR[curR-1-j]:0)+(curL-1-use+j>=0?sumL[curL-1-use+j]:0)); } // printf("BEST of TOUR-->%d IS -->%lld\n",i,cev); umin(add,cev+1ll*L*i); } return ans+add; }
#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...