제출 #1364422

#제출 시각아이디문제언어결과실행 시간메모리
1364422retarde버섯 세기 (IOI20_mushrooms)C++20
92.24 / 100
2 ms448 KiB
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;

const int M = 90;
int count_mushrooms(int n) {
	if (n <= 226) {
		int cnt = 0;
		for (int i = 1; i < n; i++) {
			if (use_machine({0, i})) continue;
			cnt++;
		}
		return cnt+1;
	}

	vector<int> as, bs; as.push_back(0);
	int a = use_machine({0, 1}), b = use_machine({0, 2});
	int c, d, flp = 0;
	if (!a && !b) {
		c = 0, d = 1;
		as.push_back(1);
		as.push_back(2);
	} else if (a && b) {
		c = 1, d = 2; flp = 1;
		bs.push_back(1);
		bs.push_back(2);
	} else {
		if (a) {
			c = 0;
			d = 2;
			bs.push_back(1);
			as.push_back(2);
		} else {
			c = 0;
			d = 1;
			bs.push_back(2);
			as.push_back(1);
		}
	}

	int ans = 1 + (1 - a) + (1 - b);
	int iter = min(n, M*2);
	for (int i = 3; i < iter; i += 2) {
		if (i >= iter) return ans;
		vector<int> query;
		query.push_back(c); query.push_back(i); query.push_back(d);
		if (i < iter - 1) {
			query.push_back(i + 1);
		}
		int k = use_machine(query);
		if (k == 0) {
			if (!flp) {
				ans++;
				as.push_back(i);
				if (i < iter - 1) {
					ans++;
					as.push_back(i + 1);
				}
			} else {
				bs.push_back(i);
				if (i < iter - 1) bs.push_back(i + 1);
			}
		} else if (k == 1) {
			if (!flp) {
				as.push_back(i);
				ans++;
				if (i < iter - 1) bs.push_back(i + 1);
			} else {
				bs.push_back(i);
				if (i < iter - 1) {
					as.push_back(i + 1);
					ans++;
				}
			}
		} else if (k == 2) {
			if (!flp) {
				bs.push_back(i);
				if (i < iter - 1) {
					as.push_back(i + 1);
					ans++;
				}
			} else {
				as.push_back(i);
				ans++;
				if (i < iter - 1) bs.push_back(i + 1);
			}
		} else {
			assert(k == 3);
			if (!flp) {
				bs.push_back(i);
				if (i < iter - 1) bs.push_back(i + 1);
			} else {
				as.push_back(i);
				ans++;
				if (i < iter - 1) {
					as.push_back(i + 1);
					ans++;
				}
			}
		}
	}

	vector<int> ps; bool flp2 = false;
	if (as.size() > bs.size()) for (auto &x : as) ps.push_back(x);
	else {
		flp2 = true;
		for (auto &x : bs) ps.push_back(x);
	}

	int c2 = 0;
	for (int i = iter; i < n; ) {
		bool curflp = false;
		vector<int> *pool = &as;
		if (bs.size() >= as.size()) {
			curflp = true;
			pool = &bs;
		}

		int take = min((int)pool->size(), n - i);

		vector<int> qrs;
		for (int j = 0; j < take; j++) {
			qrs.push_back((*pool)[j]);
			qrs.push_back(i + j);
		}

		int k = use_machine(qrs);

		int used = take - 1;
		if (curflp) {
			c2 += k / 2;
		} else {
			c2 += used - k / 2;
		}

		int last = i + take - 1;
		if (curflp) {
			if (k % 2) as.push_back(last);
			else bs.push_back(last);
		} else {
			if (k % 2) bs.push_back(last);
			else as.push_back(last);
		}

		i += take;
	}

	return (int)as.size() + c2;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…