トピックリンクします。http://codeforces.com/contest/1157/problem/C2
両側が同じ数の場合、どちら側に増加するシーケンスを取得するために時間がかかるために必要な要素を特定します
書式#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 ; チャーSTR [MAX_N]。 INT [MAX_N]。 ボイド)(解決{ // freopenは( "INPUT.TXT"、 "R"、STDIN)。 // freopenは( "output.txtと"、 "W"、STDOUT); int型のn; 一方、(scanf関数(" %のD "、&N)=!EOF){ ため(int型 i = 0 ; iがn <; ++ I)のscanf(" %dの"、および[I])。 INT S = 0、E = N - 1、0 ; // 前の为序列中最大值 ながら(S <= E){ 場合([S] <= PREV){ 一方([E]>前&& E> = S){ PREV = [e-- ] ; STR [CNT ++] = ' R ' 。 } ブレーク; } もし([E] <= PREV){ 一方([S]> PREV && S <= E){ PREV = [S ++ ]。 STR [CNT ++] = " L" ; } ブレーク; } もし([S] <[E] && [S]> PREV){ PREV = [S ++ ]。 STR [CNT ++] = ' L ' 。 続け; } もし([S]> [E] && [E]> PREV){ PREV = A [e-- ]。 STR [CNT ++] = ' R ' 。 続け; } INT E1 = 0、E2 =0 ; もし([S]> PREV){ E1 = 1 。 一方、 (S + E1 <= E && [S + E1]> [S + E1 - 1 ])++ E1。 } もし([E]> PREV){ E2 = 1 。 一方、(E - E2> = S && [E - E2]> [E - E2 + 1 ])++ E2。 } であれば(E1> E2){ PREVは、 [S ++ = ]。 STR [CNT ++] = ' L ' 。 } 他{ PREV = A [e-- ]。 STR [CNT ++] = ' R ' 。 } } STR [CNT] = ' \ 0 ' 。 printf(" %d個の\ n%sにする\ n " 、CNT、STR)。 } } int型のmain(){ )(解きます。 リターン 0 ; }