B题:クレイジーバイナリ列
-1として0、および接頭辞に、POS [0 + N] = 0
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 3 ; INT [MAXN]。 INT POS [MAXN << 1 ]。 文字列sの。 int型のmain(){ IOS :: sync_with_stdio(偽); int型のn; CIN >> N >> S; 以下のために(int型 i = 0 ; iがn <; iは++ ){ 場合(S [I] ==が' 0 ')[I] = [I- 1 ] - 1 。 他[I] = A [I- 1 ] + 1 ; } のための(int型 I = 0 ;私は= < 2 * N-を、Iは++ ){ POS [I] = - 1 ; } POS [ 0 + N - ] = 0 ; // これは単純ではないことに留意されたいが、0 + N-0 INT ANS = 0 ; のため(int型 I = 0、I <N - 、I ++は){ IF(!POS [N- + [I] = - 。1 ) ANS = MAX(ANS、I-POS [N- + A [I]); 他{ POS [N + [I] = I。 } } COUT << ANS << " " 。 int型ゼロ= 0 。 以下のために(int型 i = 0 ; iがn <I ++は{) ゼロ + = S [I] == ' 0 ' 。 } COUT <<(MIN(ゼロ、nはゼロ)<< 1)<< ENDL。 }
H题:マジックライン
ソート、N / 2ポイント及びN / 2 + 1点を見つけます。
書式#include <cstdioを> する#include <iostreamの> の#include <アルゴリズム> 使用して 名前空間はstdを、 const int型 MAXN = 20000 ; const int型 M = 900000009 ; 構造体のポイント{ int型X、Y。 } PO [MAXN]。 BOOL CMP(A点、B点){ 場合(!AX = BX)戻り AX < BX。 それ以外の 戻り AY < によって、 } int型のmain(){ int型T、N。 scanf関数(" %d個"、&T)。 一方、(T-- ){ scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++ ){ scanf関数(" %D%D "、およびPO [I] .X、&PO [I] .Y)。 } ソート(PO + 1、PO + 1 + N、CMP)。 もし(PO [N / 2 ] .X!= PO [N / 2 + 1 ] .X)のprintf(" %D%D%D%D \ n "、PO [N / 2 ] .X、M、PO [N / 2 +1 ]、 - M)。 他のprintf(" %D%D%D%D \ n "、PO [N / 2 ] .x- 1、PO [N / 2 + 1 ]・Y + M、PO [N / 2 ]・X + 1、 PO [N / 2 ] .y- M)。 } }