GUGU区
A.シーケンス
ここで、無ソリューション:$ N> * bの$または$ N <+ b-1を$
B配列は、配列を構成する各セグメントの境界でそれぞれの内部の立ち上がり、立ち下がり、セグメントに分割されます。
実装は、どのような動的境界を考えるには余りにも容易ではありません。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 名前空間stdを使用。 INT T、N、B。 ボイドの仕事() { scanf関数( "%D%D%D"、&N、&、&B)。 IF(N> 1LL * B || N <+のB-1) { プット( "いいえ")。 返します。 } プット(「はい」)。 INT BEG = N-A + 1。 (私は++; iが<= N INT I = BEG)のため のprintf( "%dの"、I)。 IF(B == 1)に戻り、 b--; INT BL =(BEG-1)/ B、今= BEG-BL。 一方、(B) { BL =(BEG-1)/ B。 今= BEG-BL; (私は++;; I <BEG私は今= INT)について 「(printfの } のputchar( 'の\ n'); } int型のmain() { scanf関数( "%のD"、&T)。 ;)(ワーク- (T)、一方 0を返します。 }
B.ショッピング
ルーチンが関係している従ってください、答えは連続区間すべきですか?
そうではありません。接頭辞を求める場合、$ A [] $ソートおよび検索する場合は$ \ FRAC {a_iを} {2}> sum_ {I-1} $、次いで$(sum_ {I-1}、\のFRAC {a_iを} { 2}] $はすでにソートされているので、このギャップを補うために他の方法ではない可能性があるため、いくつかのギャップです。
書式#include <cstdioを> する#include <iostreamの> の#include <アルゴリズム> std名前空間を使用しました。 typedefの長い長いLL。 CONST int型N = 1E5 + 5。 読み取りINT() { int型のx = 0、F = 1; CHAR CH = GETCHAR()。 (!isdigit(CH))、一方{IF(CH == ' - ')は、f = -1; CH = GETCHAR();} ながら(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。 x * Fを返します。 } INT N; LL [N]、合計[N]、ANS。 LL DIV2(LLのX) { リターン(X-1 >> 1)+1。 } )(INTメイン { )(N =読み取ります。 (; iが<= N I ++はiは1 = INT)のための [I] =(読み取り) ソート(A + 1、+ N + 1)。 以下のために(INT i = 1; iが<= N; iは++します) { IF(DIV2([I])>和[I-1])ANS + = DIV2([I]) -和[I-1] -1。 和[I] =和[I-1] + [I]。 } COUT <<合計は[N] << ENDLを-ans。 0を返します。 }
C.カウント
単語の数に制限はカタルーニャ語ではありません。
提供$のDP [L] [R] $は、プリオーダーの横断のセクションは、$ [L、R] $、$ L $サブツリーのルートへのプログラムの数です。
二次元の接頭辞およびレコードの制限、サイズ分布について列挙サブツリーを転送することができます。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 名前空間stdを使用。 読み取りINT() { int型のx = 0、F = 1; CHAR CH = GETCHAR()。 (!isdigit(CH))、一方{IF(CH == ' - ')は、f = -1; CH = GETCHAR();} ながら(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。 x * Fを返します。 } のtypedef長い長LL。 CONST LL MOD = 1E9 + 7。 CONST int型N = 405。 INT T、N、M、G [N] [N]、合計[N] [N]。 LL DP [N] [N]。 INT GET(int型のx、int型のY、INT XX、INT YY) { 戻り和[XX] [YY] -sum [X-1] [YY] -sum [XX] [Y-1] +和[X-1 ] [Y-1]。 } ボイドワーク() { N =(読み取り); M =読み取ります()。 memsetの(G、0、はsizeof(G))。 memset(和、0、はsizeof(合計))。 memsetの(DP、0、はsizeof(DP))。 以下のために(INT I = 1; I <= M; iは++) { int型のx =リード()、yが読み出さ=(); G [X] [Y] ++; } ため(; iがn = <; I = 1 int型私は++) { DPを[I] [I] = 1。 (INT J = 1; J <= N; J ++)用の 和[I] [J] =和[I-1]〜[J] +和[I]、[J-1] -sum [I-1] [J -1] + G [I] [J]。 } のための(INT LEN = 2; LEN <= N; LEN ++) { ため(INT I = 1; I + lenの-1 <= N; iは++) { int型J = I + lenの-1。 もし(DP [I] [J] + = DP [I + 1] [J])%= MOD((私、私は+ 1、i、j)を取得します!)。 もし(DP [I] [J] + = DP [I + 1] [J])%= MOD((I + 1、I、J、I)を得ます!)。 用(int型K = I + 1、K <= J-1; ++ K) (もし!取得(I、I + 1、I、K)&&!取得(K + 1、i、j、k)は、) (DP [I] [J] + = DP [I + 1] [K] * DP [K + 1] [j])%= MOD。 } } のprintf( "%LLDする\ n"、DP [1]〜[N])。 返します。 } int型のmain() { T =リード()。 ;)(ワーク- (T)、一方 0を返します。 }