POJ2182ロスト牛フェンウィックツリー、二つの点

 

 

問題の意味: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])。
}

 

おすすめ

転載: www.cnblogs.com/dongdong25800/p/11613863.html