Submission #372771

#TimeUsernameProblemLanguageResultExecution timeMemory
372771LucaDantasWiring (IOI17_wiring)C++17
100 / 100
57 ms8500 KiB
#include "wiring.h"

constexpr int maxn = 1e5+10;
constexpr long long inf = 0x3f3f3f3f3f3f3f3f;

long long dp[maxn], new_dp[maxn]; // quantos passam do block anterior

std::vector<std::vector<int>> blocks;

inline long long min(long long a, long long b) { return a < b ? a : b; }

long long min_total_length(std::vector<int> r, std::vector<int> b) {
	std::vector<int> red;
	int ptr = 0;
	for(int i = 0; i < (int)r.size(); i++) {
		std::vector<int> aq;
		for(; ptr < (int)b.size() && b[ptr] < r[i]; ptr++)
			aq.push_back(b[ptr]);
		if(aq.size()) {
			if(red.size()) blocks.push_back(red);
			blocks.push_back(aq);
			red = {r[i]};
		} else red.push_back(r[i]);
	}
	if(red.size()) blocks.push_back(red);
	if(ptr < (int)b.size()) {
		std::vector<int> sobrou;
		for(; ptr < b.size(); ptr++)
			sobrou.push_back(b[ptr]);
		blocks.push_back(sobrou);
	}

	for(int i = 0; i < maxn; i++)
		dp[i] = new_dp[i] = inf;
	dp[0] = 0;
	int n = (int)blocks.size();
	long long c_ovf = inf;

	int last_sz = 0;
	for(int i = 0; i < n; i++) {
		std::vector<int> aq = blocks[i];
		std::vector<long long> soma_pos(aq.size());
		int m = (int)aq.size();
		soma_pos[m-1] = aq[m-1];
		for(int j = m-2; j >= 0; j--)
			soma_pos[j] = soma_pos[j+1] + aq[j];

		long long ans = inf, dist = 0;
		for(int j = 0; j < m; j++) {
			// passando a partir do cara j
			ans = min(ans + c_ovf, dp[j]);
			int qtd = m-j;
			new_dp[qtd] = ans + (i<n-1 ? (long long)blocks[i+1][0]*qtd - soma_pos[j] : 0) + dist;
			dist += aq[j] - aq[0];
		}
		// não passar ngm
		ans = min(ans + c_ovf, dp[m]);
		new_dp[0] = ans + dist; // todo mundo liga pra trás

		for(int j = 0; j <= last_sz+1; j++)
			dp[j] = inf;
		for(int j = m; j >= 1; j--)
			dp[j] = min(dp[j+1], new_dp[j]), new_dp[j] = inf;
		dp[0] = new_dp[0]; new_dp[0] = inf;

		last_sz = m;
		if(i < n-1)
			c_ovf = blocks[i+1][0] - aq.back();
	}

	return dp[0];
}

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:28:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |   for(; ptr < b.size(); ptr++)
      |         ~~~~^~~~~~~~~~
#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...