Submission #655899

#TimeUsernameProblemLanguageResultExecution timeMemory
655899gs12117Broken Device 2 (JOI22_device2)C++17
100 / 100
80 ms3016 KiB
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <random>

int Declare() {
	int max_m = 139;
	return max_m;
}

std::pair<std::vector<int>, std::vector<int> > Anna(long long A) {
	int max_m = 139;
	long long int dp[200];
	for (int i = 0; i < max_m; i++) {
		if (i < 5)dp[i] = i + 1;
		else dp[i] = dp[i - 2] + dp[i - 3];
	}
	int sz = 0;
	for (int i = max_m - 3; i >= 0; i--) {
		if (A < dp[i] * 4) {
			sz = i;
			break;
		}
		A -= dp[i] * 4;
	}
	int invt = 0;
	if (A >= dp[sz] * 2) {
		A -= dp[sz] * 2;
		invt = 1;
	}
	std::vector<int> X;
	std::vector<int> Y;
	for (int i = 0; i < sz + 3; i++) {
		Y.push_back((sz + i) % 2); // last Y[sz+2]=0
	}
	if (A >= dp[sz]) {
		A -= dp[sz];
		X.push_back(1);
		X.push_back(1);
	}
	else {
		X.push_back(0);
		X.push_back(0);
	}
	int p = sz;
	while (1) {
		if (p < 5) {
			for (int i = 0; i < p; i++) {
				if (i < A)X.push_back(1);
				else X.push_back(0);
			}
			break;
		}
		else {
			if (A >= dp[p - 2]) {
				A -= dp[p - 2];
				X.push_back(1 - X[X.size() - 1]);
				p--;
			}
			X.push_back(X[X.size() - 1]);
			X.push_back(X[X.size() - 1]);
			p -= 2;
		}
	}
	X.push_back(0);
	if (invt == 1) {
		for (int i = 0; i < sz + 3; i++) {
			X[i] = 1 - X[i];
			Y[i] = 1 - Y[i];
		}
	}
	return make_pair(X, Y);
}
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <random>

long long Bruno(std::vector<int> u) {
	int max_m = 139;
	long long int dp[200];
	for (int i = 0; i < max_m; i++) {
		if (i < 5)dp[i] = i + 1;
		else dp[i] = dp[i - 2] + dp[i - 3];
	}
	int sz = u.size() / 2 - 3;
	long long int ans = 0;
	for (int i = max_m - 3; i >= 0; i--) {
		if (i == sz) {
			break;
		}
		ans += dp[i] * 4;
	}
	std::vector<int> v = u;
	if (u[u.size() - 1] == 1) {
		ans += dp[sz] * 2;
		for (int i = 0; i < v.size(); i++) {
			v[i] = 1 - v[i];
		}
	}
	int sumv = 0;
	for (int i = 0; i < v.size(); i++) {
		sumv += v[i];
	}
	sumv -= (sz + 3) / 2;
	int curmax = 0;
	int curmin = 0;
	int curv = 0;
	if (sz % 2 == 1) {
		curmax = 1;
	}
	else {
		curmin = -1;
	}
	int p = 0;
	for (; p < v.size();) {
		curv += 2 * v[p] - 1;
		p++;
		if (curv > curmax || curv < curmin) {
			break;
		}
	}
	int lastv = 0;
	int szleft = sz;
	if (curv > curmax) {
		ans += dp[sz];
		lastv = 1;
		sumv -= 2;
	}
	curmax = curv + 1;
	curmin = curv - 1;
	while (szleft >= 5) {
		curv += 2 * v[p] - 1;
		p++;
		if (curv > curmax) {
			if (lastv == 0) {
				ans += dp[szleft - 2];
				szleft--;
				sumv--;
			}
			lastv = 1;
			curmax = curv + 1;
			curmin = curv - 1;
			szleft -= 2;
			sumv -= 2;
		}
		else if (curv < curmin) {
			if (lastv == 1) {
				ans += dp[szleft - 2];
				szleft--;
			}
			lastv = 0;
			curmax = curv + 1;
			curmin = curv - 1;
			szleft -= 2;
		}
	}
	ans += sumv;
	return ans;
}

Compilation message (stderr)

Bruno.cpp: In function 'long long int Bruno(std::vector<int>)':
Bruno.cpp:24:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |   for (int i = 0; i < v.size(); i++) {
      |                   ~~^~~~~~~~~~
Bruno.cpp:29:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  for (int i = 0; i < v.size(); i++) {
      |                  ~~^~~~~~~~~~
Bruno.cpp:43:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |  for (; p < v.size();) {
      |         ~~^~~~~~~~~~
#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...