石の合併究極のユニバーサル版
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; INT石[ 50010 ]; int型N-、T、ANS; ボイドコンバイン(int型K){ int型 TEM石= [K] +石[ - K- 1 ]; // 合わせスタックK及びK-1 ANS = + TEM; のための(INT I = K; I <T- 1。 ; I ++)ストーン[I] =石[I + 1 ]; // kは順方向シフト後 T--を、 INT J; のため(= - K-J 1、J> 0 &&ストーン[J- 1。<TEM; J)ストーン[J] =ストーン[J- 1 ]; // Kバック1シフト後、TEMより位置大きい見つけること。 石[J] = TEMを; // Jに挿入TEM 一方(J> = 2 &&石[J- 2 ] <=石[J]){ // 再帰処理で得られた新たなシーケンス INT ; D = TJ // バックトラッキングのために。。。 結合(J- 1 ); J = TD; // バック } } int型のmain(){ ながら(〜scanfの(" %のD "、およびN-)){ IF(N - == 0)BREAK 。 以下のために(INT iが= 0、I <N; I ++)のscanf(" %dの"、&石[I])。 T = 1 。 ANS = 0 ; 以下のために(INT iが= 1、N iが<; I ++ ){ 石[T ++] = 石[I]。 一方、(T> = 3 &&石[T- 3 ] <=石[T- 1 ])(T-組み合わせる2)。// 从1开始遍历到结尾 } ながら(T> 1)(T-組み合わせます1); // そうでない場合は最初の再結合した後、スタックに合わせ のprintf(" %D \ N- " 、ANSは); } 戻り 0 ; }