답안 #1108810

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1108810 2024-11-05T07:03:38 Z hgmhc Coreputer (IOI23_coreputer) C++17
0 / 100
1 ms 336 KB
#include <bits/stdc++.h>
#include "coreputer.h"
using namespace std;
using ll = long long;

ll qcnt;

ll ask(ll x) {
	static int ready[16]{}, cache[16]{};
	
	if (ready[x]) return cache[x];
	ready[x] = true;
	
	vector<int> v;
	for(ll i=0; i<=x; ++i) {
		v.push_back(i);
	}
	++qcnt;
	return cache[x] = run_diagnostic(v);
}

ll ASK(vector<int> v) {
	vector<int> r;
	
	for(ll i=0; i<16; ++i) {
		if (v[i])
			r.push_back(i);
	}
	++qcnt;
	return run_diagnostic(r);
}

vector<int> malfunctioning_cores(int n) {
	ll a=0, b=n-1, z, opt=0;
	while (a<b) {
		z=(a+b)/2;
		// cerr << a << ' ' << b << endl;
		if (ask(z)<0) {
			a=z+1;
			opt=max(opt,z);
		}
		else b=z-1;
	}
	b=opt;
	assert(b<n-1);
	// cerr<<qcnt<<endl;
	// ask(b)<0
	// ask(b+1)>=0
	// ask(b+1)은 0일 수도, 1일 수도 있음
	ll c = 0;
	if (c == b+1) c++;
	// cerr << b+1 << endl;
	
	vector<int> answer(n);
	
	ll fuck = b+1==15 ? 1 : ask(b+1);
	if (fuck == 0)
	{
		vector<int> v(16);
		fill(begin(v),begin(v)+b+2,1);
		
		//   b+1  b+2
		// [....][....]
		//    n    n
		answer[b+1] = 1;
		
		for(ll i=0; i<n; ++i) if (i!=b+1 && i!=c) {
			v[i]^=1;
			
			ll r=ASK(v);
			if (r==1) {
				if (i>b+1) answer[i]=1;
				else assert(0);
			}
			else if (r==-1) {
				if (i<=b+1) answer[i]=1;
				else assert(0);
			}
			else {
				answer[i]=0;
			}
			
			v[i]^=1;
		}
		
		if (accumulate(begin(answer),end(answer),0ll)%2 == 1) {
			answer[c] = 1;
		}
	}
	else if (fuck == 1)
	{
		answer[b+1] = 1;
		
		vector<int> v(16);
		fill(begin(v),begin(v)+b+2,1);
		
		// cerr << qcnt << endl;
		
		for(ll i=0; i<=b; ++i) if (i!=c) {
			v[i]^=1;
			
			// cerr << i << endl;
			ll r = ASK(v);
			if (r==1) answer[i]=0;
			else if (r==-1) answer[i]=1;
			else assert(0);
			
			v[i]^=1;
		}
		
		if (b+2<n) {
			//     b b+1 b+2
			// [....][1][....]
			//    n       n
			fill(begin(v),begin(v)+b+1,0);
			fill(begin(v)+b+1,begin(v)+n,1);
			
			for(ll i=b+2; i<n; ++i) if (i!=c) {
				v[i]^=1;
				
				// cerr << i << endl;
				ll r = ASK(v);
				if (r==1) answer[i]=0;
				else if (r==-1) answer[i]=1;
				else assert(0);
				
				v[i]^=1;
			}
		}
		
		if (accumulate(begin(answer),end(answer),0ll)%2 == 0) {
			answer[c] = 1;
		}
	} else {
		assert(0);
	}
	
	return answer;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB Incorrect
2 Halted 0 ms 0 KB -