もともとこのゲームを思い付くためにシミュレーションが、非常にフレンドリーな感じああ〜
木の会長が直接、過去に糞便であってもよいが、多くのスペースを消費することができます。
全体の二分法を考えてみます。
コード:
#include <ビット/ STDC ++ H> に#define N 100003 の#defineが長い長いっ の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) 名前空間stdを使用。 INT A [N]、C [N]、ANS [N]、N。 INT解く(INT X) { int型CUR = 0、ANS = 0、LS = 0、I、J、RT = 0。 memset(C、0、はsizeof(C))。 用(i = 1; iは= N <; ++ I) { ++ C [A [I]]。 (C [A [I]] == 1)であれば { ++ RT。 } (RT> X)であれば { --I。 (jは= LSと、J <= I + 1; ++ j)のためのC [A [j]] - 。 RT = 0、LS = I + 1、++ ANS; } } ++ ANS; ANSを返します。 } ボイドdiv_con(int型のL、R INT) { int型L =(L)を解く、R =解く(R) IF(L == R) { ため(INT J = L; J <= R; ++ j)はANS [J] Lを=。 } 他 { int型ミッド=(L + R)>> 1。 div_con(L、MID)、div_con(MID + 1、R)。 } } int型のmain() { int型I、J。 // setIO( "入力"); scanf関数( "%のD"、&N); 用(i = 1; iは= N <; ++ I)のscanf( "%dを" &A [I])。 用(i = 1; iは* I <= N; ++ I)ANS [I] =(i)を解きます。 div_con(I、N)。 printf( "%dの"、ANS [I]);(++ I; iが<= N I = 1)のために }