問題の意味:nのnは1〜乳頭からの高さ、N-1桁の行の今牛は、2番目の数字は、そのn番目の乳牛より短い前方に牛の牛の数です。
各牛の高さのこの一連の要件。
アイデア:最後の牛の判断から始まる、すべての比較の前で最後の牛や乳牛ので、我々は、牛の数に応じて、それよりもその高さが短く決定することができ、かつその高さよりも3つのフロント短いがある場合、それは絶対にあり4、前者は乳首の高さは、私たちが牛の殺処分を検討すべき時期を決定していきながら、
だから我々は、1牛はまだ、牛が後ろから前方に横断していることを示し、それをk、各探して牛の高さを持っているよりも短く設定された長さのシーケンスを維持するn個01ができると思い、牛のK +の存在を見つけることです1つの位置、すなわち各位置の位置の接頭辞及びk + 1がバイナリであると判定され、0(1)牛を削除は
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
const int型 MAXN = 8E3 + 10 。
#defineは長い長いllの
値int [MAXN]。
INT [MAXN] C。
int型のn;
int型ANS [MAXN]。
INT尋ねる(INT X)
{
int型 ANS = 0 。
用(; X; X - = X& - X)
ANS + = C [X]。
戻るANSを。
}
ボイド追加(int型のx、int型のY)
{
用(; X <= Nであり、X + = X&-x)C [X] + = Y。
}
int型VIS [MAXN]。
INT メイン()
{
scanf関数(" %のD "、&N)
以下のために(int型私= 2 ; iが<= N; iが++ )
のscanf(" %dの"、および[I])。
以下のために(int型 i = 1 ; iが<= N; iは++ )
を追加(I、1 )。
以下のために(int型 ; I> = I = N 2 ; i-- )
{
int型のL、R、ミッド。
リットル= 1、R = N。
一方、(L <= R)
{
半ば =(L + R)/ 2 。
int型の T = (MID)頼みます。
もし(T> = A [i]が+ 1 )
、R =半ば1 。
他
リットル =ミッド+ 1 ;
}
ANS [I] = リットル;
VIS [L] = 1 。
(L、追加 - 1 )。
}
のために(int型のI =1 ; I <= N。I ++ )
{
場合(VIS [I] == 0 )
{
ANS [ 1 ] = I。
破ります;
}
}
のための(int型 I = 1を iが++; iが<= N )
のprintf(" %d個の\ n " 、ANS [I])。
}