トピックリンクします。http://codeforces.com/contest/1157/problem/F
イタリアのこと:n個の要素を含む配列内の要素を選択し、そのような環を構成する要素のほとんどは(リング要素は差の隣接絶対値を満たす<= 1)
コレクションの要素との最初の契約は、各要素の出現回数、およびソートし、重複排除のコレクションを数えます。
このようなリング構成は、ケースなければならないため:最初の要素の値が増加し、その後減少し、上昇し、逆の要素の要素の立ち下がり、
私たちは、このようなリングを構築する場合ので、私たちが出現> = 2つの要素、余分な部分2つの上昇完全放電側要素を探します、要素が1滴です
書式#include <iostreamの> の#include <CStringの> の#include <アルゴリズム> 書式#include <cmath> の#include <cstdioを> する#include <キュー> の#include <climits> 書式#include < 設定 > 書式#include <スタック> の#include < 文字列 > 書式#include <マップ> 書式#include <ベクトル> の#define 0x3f3f3f3f INF 使用して 名前空間はstdを、 typedefの長い 長いLL。 静的 constの LLのMod = 2009 ; int型[MAX_N]を、CNT [MAX_N]。 ボイド)(解決{ // freopenは( "INPUT.TXT"、 "R"、STDIN)。 // freopenは( "output.txtと"、 "W"、STDOUT); int型のk; 一方、(scanf関数(" %dの"!&K)= EOF){ ため(int型 i = 0 ; iはMAX_Nを<; ++ I)CNT [I] = 0 ; 以下のために(int型 i = 0 ; iは、kは<; ++ I){ scanf関数(" %dを"、[I]); CNT [A [I] ++ ; } ソート(A、A + K); INT TOT = UNIQUE(A、K用+) - ; // 単調増加、構築することが便利 INT ANSlを= 0、ANSR = 0、ansle = CNT [A [ 0 ]; のための(int型 I = 0 ; IはTOTを<I = Jを{J) Jが =私は+ 1 、 INTル= CNT [A [I] ]; 一方、(J <TOT && A [J] - [J - 1 ] == 1 && CNT [A [J]]> = 2)ル+ = CNT [J ++ ]。 int型の R = J - 1 。 もし(J <TOT && [J] - [J - 1 ] == 1)、R = Jル+ = CNT [J]。 もし(LE> ansle)ansle =ル、ansl = I、ANSR = R。 } のprintf(" %d個の\ n " 、ansle)。 もし(ansl == ANSR){ ため(int型 i = 0 ; I <ansle; ++ I)のprintf(" %d個の%のC "、[ansl]、I == ansle - 1?' \ n ':' ' ); 続行; } ため(int型 I = 0 ; I <CNT [A [ANSl]; ++ I)のprintf(" %のD "、Aは[ANSl]); // 上昇開始点 のための(int型 I ANSl + = 1 ; I <ANSR; ++ I){ ため(INT J = 1。 ; J <CNT [A [I]]; J ++)のprintf(" %のD "、A [I]); // ドロップ要素を残す } ため(INT I = 0; 私はCNTを<[ANSR]。++ I)のprintf(" %dの"、[ANSR])。 // 升序终点 ため(INT I = ANSR - 1 ; i>をansl; --I)のprintf(" %dの" 、[I])。 putchar(' \ nを' ); } } int型のmain(){ )(解きます。 リターン 0 ; }