C - ちかとフレンドリーペアHDU - 6534(莫队)

トピックリンク:

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 }

 

おすすめ

転載: www.cnblogs.com/letlifestop/p/10988167.html