セグメントツリータイトルセット

誰がほとんどキャンディーズを取得しますか?

 POJ - 2886 

エマープセグメントツリー+

質問の意味:N人はサークルであり、ゲームの出発点は、kにある、それぞれの人がデジタルNUM(非番)、人々の現在の円が終了するたびに保持して、次の人は、彼の最初のNUMの残っている(つまり、私は、ボールの最高得点は今、人が持っている場合は、i番目の打ち上げなので、彼のスコアは数因子である、)次の出口をk + NUMで、kは否定することができ、最初のNUMの権利を表しましたその人の数の

溶液:第一のリングに続いて、最も高いスコア、間隔の数に応じてツリーラインの確立を、取得する必要サークルID内の番号の全てよりも少ないと等しいN見つけます

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <CStringの> 
の#include <cmath> 
の#include <スタック> 
の#include <cstdlib> 
書式#include <キュー> 
の#include < 設定 > 
書式#include < 文字列。 H> 
の#include <ベクトル> 
の#include <両端キュー> 
の#include <地図>
 使用して 名前空間STDを、
#define INF 0x3f3f3f3f3f3f3f3f
 の#define INF 0x3f3f3f3f
 の#define EPS 1E-4
 の#defineバグのprintf( "********* \ n")
 の#defineデバッグ(X)COUT <<#xを"= [" << X << "]" << ENDL。#define MOD(A、B)<B:B%Bは+ 
のtypedef 長いLL。
typedefの長い長いLL。
const int型 MAXN = 5E5 + 5 int型の P [ 16 ] = { 235711131719232931374143

   

4753である}; 

int型ANS、N-;
 INT ベスト; 

ボイド DFS(int型部門、INT TMP、INT NUM){
     // リーフノード、戻り
    IF(部門> = 16のリターン;
     // NUM記録因子それらが小さい場合数、更新
    IF(NUM> ベスト){ 
        ベスト = NUM; 
        ANS = TMP; 
    } 
    // 数が同じ因子、最も小さい値であれば
    IF(NUM ==ベスト&& ANS> TMP)ANS = TMP;
     のためのINTI = 1 ; 私は= < 63 ; 私は++ ){
         場合(N / P [DEPT] <TMP)ブレーク
        DFS(DEPT + 1、TMP * = P [DEPT]、NUM×(I + 1 ))。
    } 
} 

INT [MAXN]、NUM [MAXN]、ST [MAXN << 2 ]。
文字名[MAXN] [ 20 ]。
ボイドビルド(int型、O INTの L、INT R){
     場合(L == R)ST [O]は= [L]を、
    {
         INT半ば=(L + R)>> 1 
        (Oビルド << 1 、L、MID)。
        構築(O << 1 | 1ミッド+、1 、R); 
        ST [O] = ST [O << 1 ] + ST [O << 1 | 1 ]。
    } 
} 



int型の照会(int型の POS、INT O、int型の L、INT R){ 
    ST [O] - もし(L == R)戻りL。
    INT半ば=(L + R)>> 1 int型ANS;
    もし(ST [O << 1 ]> = POS)ANS =クエリ(POS、O << 1 、L、MID)。
    { 
        POS - = ST [O << 1 ]。
        ANS =クエリ(POS、O << 1 | 1、中間+ 1 、R)。
    } 
    戻りANS。
} 
int型解く(INT X){
     int型 TMP =(INT)SQRT(X * 1.0)、ANS = 0 int型 iは= 1 ; I <= TMP iが++ ){
         場合(Xは、%I ==0 && I = X /!I){ 
            ANS + = 2 ; 
        } そう であれば(Xは%I == 0 
            ANS + = 1 ; 
    } 
    戻りANS。
} 
int型のmain(){
     int型K。
    一方、(〜のscanf(" %d個の%のD "、&​​N&K)){ 
        ANS = INF。
        最高 = 0 ; 
        DFS(011 )。
        にとってint型 i = 1 ; iが<= N; iが++ ){ 
            scanf関数(" %sの%のD "、名前[i]は、&NUM [I])。
            [I] = 1 
        } 
        ビルド(11 、N)
        int型のRET;
        int型 I = 1 ; I <= ANS iが++ ){
             int型の POS = K。
            RET =クエリ(POS、11 、N)
            POS = NUM [RET]。

            もし(ST [ 1 ] == 0ブレークもし(POS> 0)POS =((K - 2 + ST [ 1 ])%ST [ 1 ] + POS)%ST [ 1 ] + 1 他の POS =((K + POS - 1)%ST [ 1 ] + ST [ 1 ])%ST [ 1 ] + 1 
            K = POS。
        } 
        のprintf(" %sの%Dを\ n " 、名前[RET]、(ANS)を解きます)。

    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/smallhester/p/11469521.html