誰がほとんどキャンディーズを取得しますか?
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 ] = { 2、3、5、7、11、13、17、19、23、29、31、37、41、43 、47、53である}; 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(0、1、1 )。 にとって(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %sの%のD "、名前[i]は、&NUM [I])。 [I] = 1 。 } ビルド(1、1 、N) int型のRET; 用(int型 I = 1 ; I <= ANS iが++ ){ int型の POS = K。 RET =クエリ(POS、1、1 、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 。 }