トピックリンク:
http://codeforces.com/contest/1174/problem/D
質問の意味:
配列構成は、以下の条件を満足します
- すべてのサブセグメントの彼のXOR値は、$のx $と等しくありません
- $ 1 \ルa_iを<2 ^ n個の$
そのような配列の最大出力
データ範囲:
$ 18 \ $ 1 \ nは
、X <2 ^ {18} $ \ $ 1
分析:
ゲームは$サブセグメント$と$サブシーケンス$を混同すると、元のサブ段落が連続していなければならない、後者のシーケンスは、不連続であってもよいです
試合の関係者は、問題の解決策を確認した後、
シーケンス仮説が$ a_iを$を設定されている、それが接頭辞とXOR $ $ B_iであります
即:$ b_i = A_1 \ bigoplus A_2 \ bigoplus A_3 \ bigoplus A_4 ..... \ bigoplus a_iを$
$ B_i $は、次の基準を満たす必要があります
- ノー繰り返し要素、すなわち$ b_i \ NEQ b_j $
- 排他的論理和の$ X $の値の要素のない1
- 何の$ X $はありません
第二に、我々は$ gは$配列は、$ B $を追加した場合、$ G \ bigoplus X $ $ bは$配列ではありませんので、そのライン上のこれら2つの数のいずれかを選択することを知ることができます
$ a_iをb_i = \ oplus B_ {I-1} $ B配列を得た後
ACコード:
#include <ビット/ STDC ++ H> の#defineは長い長いちゃう の#define PA対<整数、整数> 名前空間stdを使用します。 const int型MAXN = 1E5 + 10。 const int型MAXM = 1E6 + 10。 constのLL MOD = 998244353; int型ANS [MAXN]。 インラインLL CAL(STをINT、INT LEN) { リターン(LL)LEN *(2 * ST + LEN-1)/ 2。 } int型のmain() { int型N、K。 (scanf関数( "%D%dの"、&N&K)== 2)一方 { IF(CAL(1、K)> N) { のprintf( "NOの\ n"); 持続する; } (N == 4 && K == 2)であれば { のprintf( "NOの\ n"); 持続する; そうであれば(N == 8 && Kの== 3) { のprintf( "NOの\ n"); 持続する; } ; ST = 1、EN = N int型 一方(ST = EN!) { int型MD =(EN ST +)/ 2。 IF(CAL(MD + 1、K)<= N)ST = MD + 1。 他のエン= MD; } ため(INT i = 1; iは= Kを<; iは++) ANS [I] = ST + I-1。 INT今= N-CAL(ST、K)、INDE = K。 一方、(今) { IF(ANS [INDE] +1 <= 2 * ANS [INDE-1])ANS [INDE] ++、INDE - 、now--。 他のINDE = K; } のprintf( "YESの\ n"); 以下のために(INT i = 1; iは= Kを<; iは++) { printf( "%dの"、ANS [I])。 もし(I == K)のprintf( "\ n")を。 他のprintf(」「); } } 0を返します。 }