19シティツアーフェンウィックツリーk番目のキャンディ

質問の意味:

ポケットは、キャンディの異なるサイズを置くことができ、お菓子も異なるサイズで来ることができます。キャンディのKはるかに小さい音量でクエリプロセス

入力T、入力操作に続いてT-基であり、m

MとX線入力オペアンプ

OPは、Xサイズキャンディに、1に等しい場合

opが2倍に等しい場合、キャンディxの大きさにそれを取ります

OPは、最初のクエリは、小さなキャンディーX 3は、に等しく、答えを出力します

アイデア:+バイナリツリーアレイ(ゲーム時間)

ここでは、最適化さフェンウィックツリー文言を書き込みます

1の#include <iostreamの>  
 2の#include <CStringの>  
 3の#include <cstdioを>  
 4の#include <cmath>  
 5の#include <アルゴリズム>  
 6の#include < ストリング >  
 7  の#define MEM(A、B)のmemset(B 、はsizeof())  
 8  の#define INF 0x3f3f3f3f  
 9  の#define LL長い長い  
 10  の#define lowbit(b)のB&( - B)  
 11  使用 名前空間STDを、  
12  CONST  INT MAXN = 1E5 + 10 13  INT C [MAXN]、F [ 20];  
14インラインint型リード(){  
 15      CHAR CH = GETCHAR()。INT X = 0、F = 1 16      一方(CH < ' 0 ' || CH> ' 9 ' ){  
 17          であれば(CH == ' - ')、F = - 1 18          CH = GETCHAR()。  
19      } ながら' 0 ' <= CH && CH <= ' 9 ' ){  
 20         X = X * 10 + CH - ' 0 ' 21          CH = GETCHAR()。  
22      } 戻り X * F。  
23  }  
 24インラインボイドアップデータ(int型のx、int型Y){  
 25      のためにINT ; I <= MAXN I + = I = X {lowbit(I))  
 26          C [I] + = Y。  
27      }  
 28  }  
 29  のint main()の  
 30  {  
 31  のint T、I、F [0 ] = 1 ;  
32  のためには、(iは= 1 ; I <= 17 ; I ++ ){  
 33      F [I] = F [I- 1 ] * 2 34  }  
 35      、T = ()を読み込みます。  
36      一方(t-- ){  
 37          のために(私は= 0 ; I <MAXN; I ++){C [I] = 0 ;}  
 38          int型M。  
39         、M = ()を読み出します。  
40          のために(私は= 0 ; I <M、I ++ ){  
 41              のint OP、X。  
42             OP =()を読み出す; X = )(読み取ります。  
43              であれば(OP == 1 ){  
 44                  アップデータ(X、1 )。  
45              }  
 46              そう であれば(OP == 2 ){  
 47                  アップデータ(X - 1 )。  
48              }  
 49              {  
 50                  INT ANS = 0、和= 0 、J。  
51                  のために(J = 17 ; J> = 0 ; j-- ){  
 52                      ANS + =J F];  
53                      であれば(ANS> = MAXN ||和+ C [ANS]> = X){  
 54                          ans- = [J] F。  
55                      }  
 56                      {  
 57                          和+ = C [ANS]。  
58                      }  
 59                  }  
 60                  のprintf(" %D \ n "、ANS + 1 )。  
61              }  
 62          }  
 63      }  
 64      リターン 0 65  }  
 66 / *  
67  2 
 68  3 
 69  1 2 
 70  1 2 
 71  3 1 
 72  4 
 73  1 2 
 74  1 3 
 75  2 2 
 76  3 1 
 77  * /  
コードの表示

おすすめ

転載: www.cnblogs.com/luoyugongxi/p/12189985.html