Submission #403018

#TimeUsernameProblemLanguageResultExecution timeMemory
403018monus1042Boxes with souvenirs (IOI15_boxes)C++17
50 / 100
2058 ms34636 KiB
#include "boxes.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 8e18;

ll subtwo(int N, int K, int L, int p[]){
	ll answer = 0;
	if (L==1) return answer;
    int mxd = L/2;
	int cnt = 0, cntright = 0;
	for (int i=0; i<N; i++){
		if (p[i] <= mxd) cnt++;
		if ((p[i] == 0 || p[i] >= mxd+1) && N%2==1) cntright++;
		else if ((p[i] == 0 || p[i] >= mxd) && N%2==0) cntright++;
	}
	if (cnt == N) return 2LL*p[N-1];
	if (cntright == N) return 2LL*(L-p[0]);
	answer = L;
	ll maxleft, maxright;
	maxleft = maxright = 0;
    for (int i=0; i<N; i++){
		if (p[i] <= mxd){
			maxleft = max(maxleft,(ll)p[i]);
		}else{
			maxright = max(maxright, (ll)L-p[i]);
		}
	}
	ll answer2 = maxleft*2LL + maxright*2LL;
	answer = min(answer, answer2);
	return answer;
}

ll subone(int N, int K, int L, int p[]){
	ll answer = 0;
	for (int i=0; i<N; i++){
		answer = answer + min(p[i],L-p[i])*2;
	}
	return answer;
}

ll brute(vector<ll>&ldp, vector<ll>&rdp, int K, int posleft, int L){
	ll res = inf;
	int szlef = ldp.size() - 1, szrig = rdp.size() - 1;
	for (int i=0; i<rdp.size(); i++){
		ll rans = rdp[i] * 2;
		ll rema = (ll)(szlef-posleft + szrig-i +K-1) / K * L;
		rans = rans + rema;
		res = min(res, rans);
	}
	return res;
}

ll sub34(int N, int K, int L, int p[]){
	vector<int> ar;
	for (int i=0; i<N; i++){
		ar.push_back(p[i]);
	}
	reverse(ar.begin(), ar.end());
	while(ar.size() && ar.back() == 0) ar.pop_back();
	reverse(ar.begin(), ar.end());
	if (ar.empty()) return 0;
	vector<int> le,ri;
	int mxd = L/2;
	for (int i=0; i<ar.size(); i++){
		if (ar[i] <= mxd) le.push_back(ar[i]);
		else ri.push_back(ar[i]);
	}
	//
	reverse(ri.begin(), ri.end());
	vector<ll> ldp,rdp;
	ldp.push_back(0);
	rdp.push_back(0);
	for (int i=0; i<le.size(); i++){
		ldp.push_back(-1);
		int cpos = i+1;
		int lpos = max(1,cpos-K+1);
		ldp[cpos] = ldp[lpos-1] + le[i];
	}
	for (int i=0; i<ri.size(); i++){
		rdp.push_back(-1);
		int cpos = i+1;
		int lpos = max(1,cpos-K+1);
		rdp[cpos] = rdp[lpos-1] + (L - ri[i]);
	}
	ll answer = inf;
	for (int i=0; i<ldp.size(); i++){
		ll curans = ldp[i] * 2;
		ll rem = brute(ldp, rdp, K, i, L);
		curans = curans + rem;
		answer = min(answer, curans);
	}
	return answer;
}

ll delivery(int N, int K, int L, int p[]) {
	if (K==1) return subone(N,K,L,p);
	else if (K==N) return subtwo(N,K,L,p);
	else return sub34(N,K,L,p);
}

Compilation message (stderr)

boxes.cpp: In function 'll subtwo(int, int, int, int*)':
boxes.cpp:7:22: warning: unused parameter 'K' [-Wunused-parameter]
    7 | ll subtwo(int N, int K, int L, int p[]){
      |                  ~~~~^
boxes.cpp: In function 'll subone(int, int, int, int*)':
boxes.cpp:34:22: warning: unused parameter 'K' [-Wunused-parameter]
   34 | ll subone(int N, int K, int L, int p[]){
      |                  ~~~~^
boxes.cpp: In function 'll brute(std::vector<long long int>&, std::vector<long long int>&, int, int, int)':
boxes.cpp:44:25: warning: conversion from 'std::vector<long long int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   44 |  int szlef = ldp.size() - 1, szrig = rdp.size() - 1;
      |              ~~~~~~~~~~~^~~
boxes.cpp:44:49: warning: conversion from 'std::vector<long long int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   44 |  int szlef = ldp.size() - 1, szrig = rdp.size() - 1;
      |                                      ~~~~~~~~~~~^~~
boxes.cpp:45:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |  for (int i=0; i<rdp.size(); i++){
      |                ~^~~~~~~~~~~
boxes.cpp: In function 'll sub34(int, int, int, int*)':
boxes.cpp:65:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |  for (int i=0; i<ar.size(); i++){
      |                ~^~~~~~~~~~
boxes.cpp:74:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |  for (int i=0; i<le.size(); i++){
      |                ~^~~~~~~~~~
boxes.cpp:80:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |  for (int i=0; i<ri.size(); i++){
      |                ~^~~~~~~~~~
boxes.cpp:87:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |  for (int i=0; i<ldp.size(); i++){
      |                ~^~~~~~~~~~~
#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...