Submission #927951

#TimeUsernameProblemLanguageResultExecution timeMemory
927951TAhmed33Boxes with souvenirs (IOI15_boxes)C++98
100 / 100
1526 ms326516 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("trapv")
typedef long long ll;
struct Mono {
	stack <pair <ll, ll>> s1, s2;
	int sze = 0;
	ll get_min () {
		if (s1.empty() || s2.empty()) {
			return s1.empty() ? s2.top().second : s1.top().second;
		} else {
			return min(s1.top().second, s2.top().second);
		}
	}
	void insert (ll x) {
		ll mn = s1.empty() ? x : min(x, s1.top().second);
		s1.push({x, mn});
		sze++;
	}
	void remove () {
		if (s2.empty()) while (!s1.empty()) {
			ll x = s1.top().first; s1.pop();
			ll mn = (s2.empty() ? x : min(x, s2.top().second));
			s2.push({x, mn});
		}
		sze--;
		s2.pop();
	}
};
Mono cur1, cur2;
ll n, k, l;
ll arr[10000001];
ll dp[10000001];
inline ll mindist (int a, int b) {
	return min({2 * arr[b], 2 * (l - arr[a]), l});
}
long long delivery (int a, int b, int c, int pp[]) {
	n = a; k = b; l = c;
	for (int i = 0; i < n; i++) {
		arr[i + 1] = pp[i];
	}
	dp[n + 1] = 0;
	cur1.insert(0);
	cur2.insert(2 * arr[n]);
	for (int i = n; i >= 1; i--) {
		if (cur1.sze > k) {
			cur1.remove();
			cur2.remove();
		}
		dp[i] = min({
			cur1.get_min() + l,
			cur1.get_min() + 2 * (l - arr[i]),
			cur2.get_min()
		});
		if (i == 1) break;
		cur1.insert(dp[i]);
		cur2.insert(dp[i] + 2 * arr[i - 1]);
	}
	return dp[1];
}

Compilation message (stderr)

boxes.cpp: In function 'long long int delivery(int, int, int, int*)':
boxes.cpp:45:15: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   45 |  for (int i = n; i >= 1; 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...