제출 #1366306

#제출 시각아이디문제언어결과실행 시간메모리
1366306thelegendary08Boxes with souvenirs (IOI15_boxes)C++17
100 / 100
354 ms196108 KiB
#include "boxes.h"
#include<bits/stdc++.h>
#define int long long
#define vi vector<int> 
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define f0r(i,n) for(int i = 0; i < n; i++)
#define FOR(i,k,n) for(int i = k; i < n; i++)
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
using namespace std; 
int L;
inline int dis(int a, int b){return min(abs(b-a), L - abs(b-a));}
long long delivery(signed N, signed K, signed L, signed pos[]) {
	::L=L; if(false){
		vi dp(N, 4e18); multiset<int>s; s.insert(dis(0,pos[0]) - pos[0]); 
		f0r(i,N){
			dp[i] = (*s.begin()) + dis(0, pos[i]) + pos[i]; 
			s.insert(dp[i] + dis(0, pos[i+1]) - pos[i+1]); 
			if(i-K+1 >= 0){
				int d = i - K + 1; if(d == 0)s.erase(s.find(dis(0,pos[d]) - pos[d])); else s.erase(s.find(dp[d-1] + dis(0,pos[d]) - pos[d]));
			}
		} return dp[N-1]; 
	}
	else{
		vi f(N); int c1 = 0, c2 = 0; f0r(i,N)if(pos[i] <= L/2){
			if(i - K >= 0)f[i] = f[i-K] + pos[i] * 2LL, c1 = f[i]; else f[i] = pos[i] * 2LL, c1 = f[i]; 
		}
		vi g(N); for(int i = N-1; i >= 0; i--)if(pos[i] > L/2){
			if(i + K < N)g[i] = g[i+K] + (L - pos[i]) * 2LL, c2 = g[i]; else g[i] = (L - pos[i]) * 2LL, c2 = g[i]; 
		}
		int ans = c1 + c2; for(int i = 0; i + K - 1 < N; i++){
			int cur = 0; if(pos[i] > L / 2 || pos[i + K - 1] <= L / 2)continue; 
			if(i > 0)cur += f[i-1]; cur += L; if(i + K < N)cur += g[i + K]; ans = min(ans, cur);
		} return ans;
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…