제출 #841799

#제출 시각아이디문제언어결과실행 시간메모리
841799emuyumiLongest Trip (IOI23_longesttrip)C++17
15 / 100
13 ms600 KiB
#include "longesttrip.h"

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

vector<int> longest_trip(int N, int D) {

	// check if single component
	// if not, each component is clique, problem is then find largest component

	// otherwise, one component,
	// start with one node and keep trying to extend path by randomly querying
	// if gets stuck, that means past must be a clique, done

	int calls = 0;
	auto my_are_connected = [&](vector<int> a, vector<int> b) {
		calls ++;
		assert(calls <= 32460);
		return are_connected(a, b);
	};

	bool found = 0;
	vector<int> answer;
	using vi = vector<int>;
	auto halves = [&](vector<int> v) -> pair<vi, vi> {
		int m = v.size() / 2;
		return {{v.begin(), v.begin()+m}, {v.begin()+m, v.end()}};
	};

	vector<int> path = {0};
	vector<int> left(N-1);
	vector<int> clique;
	iota(left.begin(), left.end(), 1);
	while (left.size() || !clique.empty()) {
		random_shuffle(left.begin(), left.end());

		auto locate = [&](vector<int> src, vector<int> dest) -> int {
			while (src.size() != 1) {
				auto [a, b] = halves(src);
				if (my_are_connected(a, dest)) src = a;
				else src = b;
			}
			return src[0];
		};

		// auto add = [&](int nxt) -> void {
		// 	path.push_back(nxt);
		// 	for (int x : clique[nxt]) path.push_back(x);
		// };

		int v = path.back();
		if (!clique.empty()) {
			// cerr << "a";
			if (my_are_connected(clique, {v})) {
				int b = locate(clique, {v});
				clique.erase(find(clique.begin(), clique.end(), b));
				path.push_back(b);
				for (int x : clique) path.push_back(x);
				clique.clear();
				continue;
			}
		}
		while (!left.empty()) {
			int nxt = left.back(); left.pop_back();
			// cerr << left.size() + clique.size() << " ";
			if (!my_are_connected({nxt}, {v})) {
				clique.push_back(nxt);
			}
			else {
				path.push_back(nxt);
				break;
			}
		}

		if (left.empty() && !clique.empty()) {
			left = clique;
			if (!my_are_connected(path, left)) {
				if (path.size() > left.size()) return path;
				else return left;
			}
			int a = locate(path, left);
			int b = locate(left, {a});

			vector<int> ans = left;
			ans.erase(find(ans.begin(), ans.end(), b));
			ans.push_back(b);
			int j = find(path.begin(), path.end(), a) - path.begin();
			if (j == 0) {
				for (int x : path) {
					ans.push_back(x);
				}
			}
			else {
				for (int i = j; i >= 0; --i) {
					ans.push_back(path[i]);
				}
				for (int i = path.size()-1; i > j; --i) {
					ans.push_back(path[i]);
				}
			}
			// for (int i = 1; i < ans.size(); ++i) {
			// 	assert(my_are_connected({ans[i]}, {ans[i-1]}));
			// }
			return ans;

		}
	}
	for (int i = 1; i < path.size(); ++i) {
		assert(my_are_connected({path[i]}, {path[i-1]}));
	}
	return path;
}

컴파일 시 표준 에러 (stderr) 메시지

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:109:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |  for (int i = 1; i < path.size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
longesttrip.cpp:23:7: warning: unused variable 'found' [-Wunused-variable]
   23 |  bool found = 0;
      |       ^~~~~
#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...