HIR180's diary

ICPC World Finals 2022 を集大成に

2014-01-06

JOI Messenger 16:53

基本方針:

A: (2,x)に向かって突き進む。(2,x)にきたら伝播開始。

次のbitが0なら(1,x)をぐるぐるして、1なら(3,x)をぐるぐるする。

Bが(2,x)に戻し、まだ送るべきbitがあるなら上の操作を繰り返す。

そうでないときは同じところをぐるぐる。

B: 5回ターンが回ってくるまでは何もしない。(適当にぐるぐる)

5回目以降は(1,x)なら*2 ,(3,x)なら*2+1 ,(2,x)なら伝播終了。

いずれの場合も(2,x)に戻す。あとは適当にぐるぐるする。

面白い問題だと思いました。


//Daily Lunch Special Tanoshii !!
#include "grader.h"
#include 
#include 
#include 
using namespace std;
#define pb push_back
 
int cur=0;
bool beg=false;
vector<int>bit;
int prex=-1,prey=-1;
int pre2x=-1,pre2y=-1;
bool mov=false;
static int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0};
void InitA(int T,int X)
{
	while(X)
	{
		bit.pb((X%2)); X/=2;
	}
	reverse(bit.begin(),bit.end());
}
int GameA(int I,int J)
{
	int a=I,b=J,ret;
	mov=false;
	if(prex!=a || prey!=b)
	{
		if(prex!=-1) mov=true;
	}
	if(mov || prex==-1)
	{
		pre2x=a; pre2y=b;
	}
	if(!beg)
	{
		if(a>=3) ret=-1;
		if(a==1) ret=-2;
		if(a==2)
		{
			beg=true;
			if(!bit[cur]) ret=-1;
			else ret=-2;
		}
	}
	else
	{
		if(a==2 && mov && cur!=bit.size()-1)
		{
			cur++;
			if(!bit[cur]) ret=-1;
			else ret=-2;
		}
		else
		{
			if(b==1) ret=-4;
			if(b==4) ret=-3;
			if(b==2) {if(pre2x==a && pre2y==3) ret=-3;else ret=-4;}
			if(b==3) {if(pre2x==a && pre2y==2) ret=-4;else ret=-3;}
		}
	}
	prex=a+dx[ret+4]; prey=b+dy[ret+4];
	return ret;
}
 
void InitB(int T){}
 
int zx=-1,zy=-1;
int z2x=-1,z2y=-1;
int v=0;
bool move2;
int res=0;
int GameB(int I,int J)
{
	int a=I,b=J,ret; move2=false;
	if(zx!=a || zy!=b)
	{
		move2=true;
		v++; zx=a; zy=b;
		z2x=a; z2y=b;
	}
	if(v<5 || !move2)
	{
		if(b==1) ret=-4;
		if(b==4) ret=-3;
		if(b==2) {if(z2x==a && z2y==3) ret=-3;else ret=-4;}
		if(b==3) {if(z2x==a && z2y==2) ret=-4;else ret=-3;}
	}
	else
	{
		if(a==1) {res*=2;ret=-2;}
		if(a==3) {res=(res*2+1); ret=-1;}
		if(a==2) ret=res;
	}
	if(ret<0) {zx=a+dx[ret+4]; zy=b+dy[ret+4];}
	return ret;
}