제출 #1328340

#제출 시각아이디문제언어결과실행 시간메모리
1328340thelegendary08Sphinx's Riddle (IOI24_sphinx)C++17
36 / 100
29 ms412 KiB
#include "sphinx.h"
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define f0r(i,n) for(int i = 0; i < n; i++)
#define FOR(i,k,n) for(int i = k; i < n; i++)
#define vi vector<int>
#define pii pair<int,int>
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
#define ask(v) perform_experiment(v)
using namespace std;
std::vector<int> find_colours(int n, std::vector<int> U, std::vector<int> V) {
	vi real = {125,4,99,194,150,105,127,11,154,58,149,29,198,138,233,140,50,87,115,131,169,156,205,50,41,227,204,187,246,9,153,163,196,245,19,114,39,184,138,138,34,30,40,74,239,137,107,70,54,162,240,110,132,9,176,17,81,36,214,130,7,7,2,171,95,208,81,218,159,51,191,73,101,84,241,180,142,106,239,49,100,218,197,199,46,196,202,100,220,65,15,143,65,83,216,27,135,245,19,35,52,25,205,211,73,13,249,216,129,160,181,249,87,184,3,129,54,182,202,29,12,104,75,167,75,128,218,224,216,220,59,239,67,192,179,22,176,130,237,55,144,192,73,61,95,26,150,210,57,12,129,13,183,130,188,133,138,150,50,51,44,89,172,169,162,107,133,137,209,177,84,36,37,166,71,35,92,243,211,233,60,232,79,214,79,96,105,195,79,126,53,140,36,126,220,21,42,144,163,112,217,68,140,184,162,192,54,52,174,45,239,164,6,49,101,35,93,22,188,146,150,23,158,238,177,157,243,157,18,43,228,149,31,44,249,134,145,210,213,130,149,130,184,210,91,171,23,130,214,215};
	vi ans(n, -1); int N = n, idk = 0; 
	if(n%2==1){
		f0r(c,n){vi quer(n,c); quer[n-1] = -1; int ret = ask(quer); if(ret == 1){ans[n-1] = c; break;}} N--, idk = 1; 
	}
	f0r(c,n){
		vi quer(n,c); for(int i = 1; i < N; i+=2)quer[i] = -1; if(n!=N)quer.back() = n; 
		int ret = ask(quer); ret-=idk; ret = N - ret; int cnt = ret/2 + ret%2; 
		int pv = N/2-1; while(cnt>0){
			int lo = 0, hi = pv; while(lo < hi){
				int mid = lo + (hi-lo+1) / 2; //check if [mid, pv] got col c
				vi quer(n,n); int bruh = 1; if(mid==0)bruh=0; 
				for(int i = 2*mid; i < 2*pv+2; i++){bruh++; if(i%2==0)quer[i] = c; else quer[i] = -1;}
				if(idk || pv < N/2-1)bruh++; 
				int ret = ask(quer); if(ret==bruh)hi=mid-1; else lo=mid;
			} ans[lo*2+1] = c; pv = lo - 1; cnt--;
		} 
		f0r(i,n)quer[i]=c; for(int i = 0; i < N; i+=2)quer[i] = -1; if(n!=N)quer.back() = n; 
		ret = ask(quer); ret -= idk; ret = N - ret; cnt = ret/2 + ret%2;
		pv = 0; while(cnt > 0){
			int lo = pv, hi = N/2-1; while(lo < hi){
				int mid = lo + (hi-lo) / 2; //check if [pv,mid] got col c
				vi quer(n,n); int bruh = 1; if(mid==N/2-1 && idk==0)bruh=0; if(pv > 0)bruh++; 
				for(int i = pv*2; i <= 2*mid+1; i++){bruh++; if(i%2==0)quer[i] = -1; else quer[i]=c;}
				int ret = ask(quer); if(ret==bruh)lo=mid+1; else hi=mid; 
			}
			ans[lo*2] = c; pv = lo + 1; cnt--;
		}
	}
	return ans;
}
#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...