トピックリンク:
https://cn.vjudge.net/problem/HDU-6534
効果の件名:
あなたは、N、M、K。次に、入力数N、M間隔。[J] - [I] | | <= kの番号(i = jのを<)次に、各セクションを満たすに尋ねます。
具体的なアイデア:
Moのフォースは各区間、フェンウィックツリークエリによって特定のクエリに対応します。
ACコード:
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3位LL定義長い 長 4 のconst int型 MAXN = 2E6 + 100 。 5 INT N、M、K、ブロック。 6 構造体ポイント 7 { 8 int型UPP、低、ヴァル、now_pos。 9 } [MAXN]。 10 構造体ノード 11 { 12 INT ST編、ID。 13 ノード(){} 14 ノード(INT XX、INT YY、INT ZZ) 15 { 16 ST = XX、ED = YY、ID = ZZ。 17 } 18 ブールフレンド演算子 < (ノードT1、ノードT2) 19 { 20 であれば(t1.st/block!=t2.st/のブロック) 21 リターン t1.st/block <t2.st/ ブロック。 22 リターン t1.ed /ブロックは</ t2.ed ブロック。 23 } 24 } Q [MAXN]。 25 INTは[MAXN] ANS。 26ベクター< INT > STO。 27 INTget_lower(INT NUM) 28 { 29 リターン LOWER_BOUND(sto.begin()、sto.end()、NUM)-sto.begin()+ 1 。 30 } 31 INT get_upper(INT NUM) 32 { 33 リターン UPPER_BOUND(sto.begin()、sto.end()、NUM) - sto.begin(); //注意这里是LOWER_BOUND 34 } 35 のint ツリー[MAXN] ; 36 int型SZ。 37 INT lowbit(INT T) 38 { 39 リターン T& - T。 40 } 41 空隙追加(int型の POS、int型タイプ) 42 { 43 ながら(POS <= SZ) 44 { 45 ツリー[POS] + = タイプ; 46台の POS + = lowbit(POS)。 47 } 48 } 49 INTは(ASK int型POS)の 50 { 51 のint NUM = 0 。 52 もし(!POS) 53 リターン 0 ; 54 一方(POS) 55 { 56 NUM + = ツリー[POS]。 57 POS-= lowbit(POS)。 58 } 59 リターンNUM。 60 } 61 ボイド(解決) 62 { 63 のint = NUM 0 。 64 INTは L = 1、R = 0 。 65 のために(int型 I = 1 ; I <= M; iが++ ) 66 { 67 ながら(L < Q [i]は.ST) 68 { 69 ([L] .now_posを-追加1 )。 70 num- =尋ねる([L] .upp)-ask([L] .low- 1 )。 71 L ++ 。 72 } 73 ながら(L> Q [i]は.ST) 74 { 75 l-- 。 76 NUM + =尋ねる([L] .upp)-ask([L] .low- 1 )。 77 追加([L] .now_pos、1 )。 78 } 79 ながら(R < Q [i]は.ED) 80 { 81 R ++ 。 82 NUM + =([R] .upp)-ask尋ねる([R]を.low- 1 )。 83 追加([R] .now_pos、1 )。 84 } 85 ながら(R> Q [i]は.ED) 86 { 87 アドオン([R] .now_pos、 - 1 )。 88 num- =尋ねる([R] .upp)-ask([R] .low- 1 )。 89 r--の; 90 } 91の ANS [Q [i]は.ID] = NUM。 92 } 93 } 94 のint main()の 95 { 96 のscanf(" %D%D%D "、&N、&M、およびK); 97 のために(int型 i = 1 ; iが<= N; iが++ ) 98 { 99 のscanf(" %dの"、および[I] .val)。 100 sto.push_back([I] .val)。 101 } 102 ソート(sto.begin()、sto.end())。 103 sto.erase(ユニーク(sto.begin()、sto.end())、sto.end()); //离散化 104 SZ = sto.size()。 105 のためには、(int型 i = 1 ; iが<= N; I ++) 106 { 107 A [I] = .now_pos get_lower([I] .val); //前処理の範囲内の各点に達することができる 108 A [I] .low get_lower =([I] .val - K); 109 A [I] .upp = get_upper([I] .val + K); 110 } 111 INT ST、ED; 112 用(INT I = 1 ; I <= M; I ++ ) 113 { 114 scanfの(" %のD%のD "、およびST&ED); 115 Q [I] = ノード(ST、ED、I); 1 16 } 117 ブロック(=INT )(SQRT(N))。 118 ソート(Q + 1、Q + M + 1 )。 119 )(解きます。 120 のためには、(int型 I = 1 iが++; I <= M ) 121 { 122 のprintf(" %d個の\ n " 、ANS [I])。 123 } 124 戻り 0 ; 125 }