답안 #686019

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
686019 2023-01-25T05:06:54 Z jamezzz Flight to the Ford (BOI22_communication) C++17
15 / 100
635 ms 1900 KB
#include "communication.h"
#include <bits/stdc++.h>
using namespace std;
//
// --- Sample implementation for the task communication ---
//
// To compile this program with the sample grader, place:
//     communication.h communication_sample.cpp sample_grader.cpp
// in a single folder, then open the terminal in this directory (right-click onto an empty spot in the directory,
// left click on "Open in terminal") and enter e.g.:
//     g++ -std=c++17 communication_sample.cpp sample_grader.cpp
// in this folder. This will create a file a.out in the current directory which you can execute from the terminal
// as ./a.out
// See task statement or sample_grader.cpp for the input specification
//

typedef pair<int,int> ii;
typedef vector<ii> vii;
#define pf printf
#define pb push_back
#define sz(x) (int)x.size()

int getSize(vii &v){
	int sum=0;
	for(auto[a,b]:v)sum+=b-a+1;
	return sum;
}

int inside(vii &v,int X){
	int half=getSize(v)/2;
	for(int i=0;i<sz(v);++i){
		if(half==0)break;
		auto[l,r]=v[i];
		if(r-l+1<=half){
			if(l<=X&&X<=r)return 1;
			half-=r-l+1;
		}
		else{
			if(l<=X&&X<=l+half-1)return 1;
			half=0;
		}
	}
	return 0;
}

void split(vii &v,vii &vi,vii &ve){
	int half=getSize(v)/2;
	for(int i=0;i<sz(v);++i){
		auto[l,r]=v[i];
		if(r-l+1<=half)vi.pb({l,r}),half-=r-l+1;
		else if(half==0)ve.pb({l,r});
		else vi.pb({l,l+half-1}),ve.pb({l+half,r}),half=0;
	}
}

void encode(int N,int X){
    vii corr,wrong;
    corr.pb({1,N});
    while(getSize(corr)+getSize(wrong)>3){
		//pf("corr: ");for(auto[l,r]:corr)pf("(%d %d) ",l,r);pf("\n");
		//pf("wrong: ");for(auto[l,r]:wrong)pf("(%d %d) ",l,r);pf("\n");
		int res=send(inside(corr,X)||inside(wrong,X));
		vector<ii> corrI,corrE,wrongI,wrongE;
		split(corr,corrI,corrE);
		split(wrong,wrongI,wrongE);
		corr.clear();
		wrong.clear();
		if(res==1){
			for(ii x:corrI)corr.pb(x);
			for(ii x:wrongI)corr.pb(x);
			for(ii x:corrE)wrong.pb(x);
		}
		else{
			for(ii x:corrE)corr.pb(x);
			for(ii x:wrongE)corr.pb(x);
			for(ii x:corrI)wrong.pb(x);
		}
	}
	vector<int> rem;
	for(auto [l,r]:corr){
		for(int i=l;i<=r;++i)rem.pb(i);
	}
	for(auto [l,r]:wrong){
		for(int i=l;i<=r;++i)rem.pb(i);
	}
	//pf("rem: ");for(int i:rem)pf("%d ",i);pf("\n");
	if(X==rem[0])send(0),send(0),send(0),send(0);
	if(X==rem[1])send(0),send(1),send(1),send(0);
	if(X==rem[2])send(1),send(1),send(1),send(1);
}

ii decode(int N){
    vii corr,wrong;
    corr.pb({1,N});
    while(getSize(corr)+getSize(wrong)>3){
		//pf("corr: ");for(auto[l,r]:corr)pf("(%d %d) ",l,r);pf("\n");
		//pf("wrong: ");for(auto[l,r]:wrong)pf("(%d %d) ",l,r);pf("\n");
		int res=receive();
		vector<ii> corrI,corrE,wrongI,wrongE;
		split(corr,corrI,corrE);
		split(wrong,wrongI,wrongE);
		corr.clear();
		wrong.clear();
		if(res==1){
			for(ii x:corrI)corr.pb(x);
			for(ii x:wrongI)corr.pb(x);
			for(ii x:corrE)wrong.pb(x);
		}
		else{
			for(ii x:corrE)corr.pb(x);
			for(ii x:wrongE)corr.pb(x);
			for(ii x:corrI)wrong.pb(x);
		}
	}
	vector<int> rem;
	for(auto [l,r]:corr){
		for(int i=l;i<=r;++i)rem.pb(i);
	}
	for(auto [l,r]:wrong){
		for(int i=l;i<=r;++i)rem.pb(i);
	}
	//pf("rem: ");for(int i:rem)pf("%d ",i);pf("\n");
	int msk=0;
	for(int i=0;i<4;++i){
		int x=receive();
		msk+=x<<i;
	}
	vector<int> msks={0,6,15},pos;
	for(int i=0;i<3;++i){
		int diff=msks[i]^msk;
		if(__builtin_popcount(diff)<2||diff==5||diff==9||diff==10)pos.pb(rem[i]);
	}
	pos.pb(1);
	return {pos[0],pos[1]};
}
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 1688 KB Output is correct
2 Correct 14 ms 1684 KB Output is correct
3 Correct 11 ms 1804 KB Output is correct
4 Correct 12 ms 1688 KB Output is correct
5 Correct 15 ms 1740 KB Output is correct
6 Correct 31 ms 1756 KB Output is correct
7 Correct 50 ms 1900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 635 ms 1752 KB Output is partially correct
2 Incorrect 4 ms 236 KB Not correct
3 Halted 0 ms 0 KB -