説明の最初の章のように見えはしないでくださいグー
問題のA.
問題の意味
数xが与えられ、構成は、2つの正の整数、bは、必要とするようにGCD(A、B)+ LCM(A、B)= X。(X <= 1E9)
ソリューション
単純な構造、被験者の要件を満たす= 1、B = X-1。
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INT T、N。 INT メイン(){ scanf関数(" %のD "、&T)。 一方、(T - ){ scanf関数(" %のD "、&N) printf(" %D%D \ n "、1、N - 1 )。 } 戻り 0 。 }
問題のB.
問題の意味
アレイA1、A2、A3所与、......、新規性の、コピーされたn回のアレイ(すなわち、A1、A2、...、A1、A2、...、A1、......)、配列最長シーケンスの長さが増します。
ソリューション
分析は、元の配列はm個の要素の重複数を除いたと仮定すると、最長のサブシーケンスの長さMは、選択の数は確かに繰り返される超えている場合、定義された最も長いシーケンスの増加を満たしていない(もっとmより上昇することができません)。アレイにおけるIのi番目のアレイ採取多数の前後が最も長いシーケンスの数mの増加を有するように構成されています。
したがって、常に最も長いシーケンス長は、溶液Mの存在下で増加されています。
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT N = 1E5 + 5 。 INT T、N、[N]。 INT メイン(){ scanf関数(" %のD "、&T)。 一方、(T - ){ scanf関数(" %のD "、&N) マップ < int型、ブール > 融点; int型 ANS = 0 ; 以下のために(INT iが= 1 ; I <= N; I ++){ scanf関数(" %のD "、および[I])。 もし(!MP [[I]]) ANS ++ ; MP [I] = 真。 } のprintf(" %dの\ n " 、ANS)。 } 戻り 0 。 }
問題のC.
問題の意味
どのような問題の書き込みスパイシーなチキンの事に直面し、それが質問3分のタイトル曲のタイトル1分書かれた質問を見るために45分の5分ほしいですしました
ツリーは、請求項0,1,2にN-1、Nのノードをエッジ与え、...、N-2、全ての側面上付き文字で定義されているUのツリーを除いMEX(U、V)側部値以外のすべての辺の最小のツリーを介してV単純な経路、例えば任意のuのために、MEXの最大値は、(U、V)vができるだけ小さいようです。
再びMEXの定義をそれを説明します:
これは、ツリー内の指定されたサンプルの対象です。
我々はMEX(4,6)を要求したとします。
4-> 6を得るための簡単なパス:
図から分かるように、三方2,4を通る経路は、残りのツリーは、最小値は0であり、0であることMEX(4,6)0,3エッジ。
MEX(4,3)= 1、MEX(3,6)= 2、同様に利用できます。
ソリューション
明らかに、単純なパスで別の地点からツリーのいずれかが同じ点に接続された任意の三辺を通過しないと同等、二回同じ点を通過しません。
これは、最小のツリー回答で構成することができる:3点以上を探し、0,1,2に割り当てられた点の3辺のいずれかに接続されるように、エッジによって接続されています。
0,1,2三辺は、単純なパス上に存在することはできませんので、その答えは2です。そして、任意の木の両側には、答えが2より大きくすることはできませんのでことを、簡単なパス上に存在することができるので。
見つけることができ、この構造が最適です。
コード
状況に特別な注意がチェーンとして木を宣告しました。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT N = 1E5 + 5 。 整数 N、M、選んだ、ANS [N]、ティム、CNT = 3 、訪問[N]。 ベクター < INT > G [N]。 対 < INT、INT > P [N]。 int型のmain(){ scanf関数(" %のD "、&n)を。 以下のために(INT iが= 1 ; I <N; I ++ ){ int型、U、V。 scanf関数(" %D%D"、&U&V); G [U] .push_back(V); G [V] .push_back(U); P [i]が1次回 = U; P [i]は.second = V; } ため(INT iは= 1 ; I <= N; I ++ ) 場合(G [i]が.size()> = 3 ){ を選択した = I; ブレーク; } 場合(==選択した0 ){ ため(INT iは= 1。 I <N; I ++ ) のprintf("%D \ n "、I - 1 ); 戻り 0 ; } ため(INT iが= 1 ; iが<N; I ++ ) 場合(P [i]が1次回== || P [i]は.second =を選びました= 選択した){ ANS [I] = ティム; ティム ++ ; 訪問[I] = 1 ; 場合(TIM> 2 ) 休憩; } ため(INT iは= 1 ; I <N; I ++ ) もし(!訪問は[i])と ANS [i]は = CNT ++ ; 以下のために(INT iが= 1 ; I <N I ++ ) のprintf(" %D \ n " 、ANS [I])。 リターン 0 ; }
問題のD.
問題の意味
短い長さNのすべての要素のアレイと所定値V、および排他的OR所定の値uのためのすべての要素のそのようなアレイとして構成される。
ソリューション
建設法外に3つの質問**
最初のステップは、V解けるかどうか、Uを決定することです。
XORのいくつかの数とそれらの合計よりも確かに大きくないが、それは以下のV、U以上であってはなりません。
第二に、排他的OR 1であり、ビット場合、アレイは、1ビットの必須の数は奇数であり、ビットが1であるべきです。同様に、排他的論理和ビットと0であり、ビットはゼロでなければなりません。
したがって、場合にのみ、Vは> = uおよび(Vuが)| 2は、ケース、U、Vの可解です。
我々は文特許N <3例を考えるだけでよいので、明らかに、ケース可解U、V、で{U(VU)/ 2、(VU)/ 2}、常に解決可能な構成です。
N = 0:Uの場合に解けるは、V = = 0。
N = 1:Uの場合には解けるが、V =。
N = 2:{/ 2( U + V)/ 2、(VU)} を満たす場合に設立された状態。(具体的な理由のない書き込みには、内の別のブログを書きます)
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 長い 長N、M。 int型のmain(){ scanf関数を(" %LLD%LLD "、&N、&M)。 もし(N> M ||(M - N)%2!= 0 ){ プット(" -1 " )。 リターン 0 ; } そう であれば(N == M && N == 0 ){ プット(" 0 " )。 } そう であれば(N == M){ のprintf( " 1 \ N%LLD " 、N) } 他{ 長い 長 X =(N + M)/ 2、Y = N。 長い 長い = X、B = X - Y。 もし((+ b)は== M &&(^ B)== N) のprintf(" 2 \ N%LLD%LLD " 、B)。 他 のprintf(" 3 \ N%LLD%LLD%LLD "、N、(M - N)/ 2、(M - N)/ 2 )。 リターン 0 ; } リターン 0 。 }