kmjp's blog

競技プログラミング参加記です

yukicoder : No.3562 Communicate Sorted Vector

お、コミュニケーション問題だ。
https://yukicoder.me/problems/no/3562

問題

先手は、14要素以下で、最大値10^9以下の狭義単調増加な正整数列Aを与えられる。
合計377文字以内の複数のバイナリ文字列を後手に送り、後手にAを復元させよ。

解法

Aの階差数列を作り、それぞれ2進数表記を送ろう。
その際、階差数列の各要素は正なので、最上位ビットは1固定である。よって最上位ビットを省略するとよい。
例外ケースとして、1を2進数表記にして最上位ビットを省略すると空文字になるため、値はインクリメントして渡すとよい。

string S;
int N;
int Q;
int A[20];


void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>S>>N>>Q;
	if(S=="Alice") {
		FOR(i,N) {
			cin>>A[i+1];
		}
		cout<<N<<endl;
		FOR(i,N) {
			x=A[i+1]-A[i]+1;
			string V;
			while(x) {
				V+='0'+(x%2);
				x/=2;
			}
			reverse(ALL(V));
			cout<<V.substr(1)<<endl;
		}
	}
	else {
		cin>>N;
		FOR(i,N) {
			cin>>s;
			s="1"+s;
			int v=0;
			FORR(a,s) v=v*2+(a-'0');
			A[i+1]=A[i]+v-1;
			cout<<A[i+1]<<" ";
		}
		cout<<endl;
		
			
	}
}

まとめ

これ想定解法の1番目じゃないのね。