羅区P1972 [SDOI2009] HHネックレス(フェンウィックツリー、オフライン)

ポータル

問題解決のためのアイデア

それは需要間隔の異なる種類の数があるので、我々はフェンウィックツリー使用しているため(そして一見無しの直接の接触を)

(...表現します)

またはSと、オリジナルと同じ[I] [I-lowbit(I)]の種類の数を表すために... [I]です。

重鎖と同様の動作であるので、アレイは約レコードがあるので、[i]はiは、シェルが最初に発生数、各時間Sが[i]がある]の更新結果を表し; - Sを[ I] ++;ている[I] = I。

しかし、私たちは一つのセクションは、お問い合わせは、B-3は、B-7が登場している。このシェルで... B、次の間隔... B-5、およびX(<B-7をされたと仮定していることを考えます<B-5 <B-3 <b)に、 我々はA ... S [B-7]とき、Bということを求めている- ;答えはエラーになりますときに(あまり... B-5を頼みますa)に忘れます。(説明は、それを理解し、感情的な明確ではありません)

そこでここでは、アクションを使用- オフライン、オフラインいわゆる、ワンタイムの問題は、(問題解決を促進するために)並べ替えるために、特定の順序に従って、すべて入力され、その後、元の順序に従って解答出力を保存します。

どのようにオフラインのアプリケーションはありますか?我々格納された構造データを使用することができ、各可変構造がキーワードで再度ソートのすべての値を読んだ後、別のシリアル番号が格納され、格納された値を有し、キーワード数前者によれば、その後、ソート再び答える出力するので、その目的。

例えば、質問:

1  構造体QUES {
 2      のint L、R&LT、ANS、ID;
 3  } Q [MAXN];
 4  BOOL CMP1(QUES A、QUES B){
 5。     復帰のAr < BR;
 6  }
 。7  BOOL CMP2(QUES A、QUES B) {
 8。     リターン a.id < b.id;
 9  }
 10  INT メイン(){
 11      // データを読み出す
12は      ソート(Qの+ 1、M + Q + 1、CMP1); //は、第一ソート渡す
 13れる     // 得答え
14      ソート(Q +を。1、M + Q +。1、CMP2); // 第二通過ソート
 15      // 出力回答
16      リターン 0 ;
 17 }

ACコード

1の#include <iostreamの>
 2の#include <アルゴリズム>
 3の#include <cstdioを>
 4  使って 名前空間STD。
5  のconst  int型 MAXN = 500005 ;
6  INT S [MAXN]、N [MAXN]、M。
7  INTが ある [* MAXN 2 ]。
8インラインINT lowbit(INT X){
 9      リターン X&( - X)。
10  }
 11  空隙インサート(int型 ID、int型K){
 12      のためにint型 I = ID; I <= N。I + = lowbit(I)){
 13の          S [I] + = K。
14      }
 15  }
 16  INTクエリ(INT ID){
 17      のintのRES = 0 18      のためには、int型 I = IDを、I> 0 ; I- = lowbit(I)){
 19の          RES + =のS [i]は、
20      }
 21の     リターンRES。
22  }
 23  構造体QUES {
 24      のint L、R、ANS、ID。
25  } Q [MAXN]。
26 ブールCMP1は(QUES、QUES B){
 27      リターン AR < BR。
28  }
 29  ブールCMP2は(QUES、QUES B){
 30      リターン a.id < b.id。
31  }
 32  INT メイン(){
 33      CIN >> N。
34      int型 CNT = 1 35      のためにint型 i = 1 ; iが<= N; iが++ ){
 36          のscanf(" %dの"、および[I])。
37      }
 38      CIN >> M。
39      のためにint型 I = 1 ; I <= M; iが++ ){
 40          のscanf(" %D%dの"、&​​Q [i]は.L&Q [I] .R)。
41          Q [i]は.ID = I。
42      }
 43      ソート(Q + 1、Q + M + 1 、CMP1)。
44      のためにint型 i = 1 ; iが<= N iが++ ){
 45          であればされている[[I]]){
 46              インサートは(ある - [[I]、1 ;)
47          }
 48         挿入(I、1 )。
49          である [I] = I。
50          一方(Q [CNT] .R == I && CNT <= M){
 51              Q [CNT] .ans =クエリ(Q [CNT] .R)-query(Q [CNT] .l- 1 )。
52              CNT ++ ;
53          }
 54      }
 55      ソート(Q + 1、Q + M + 1 、CMP2)。
56      のためにint型 I = 1 ; I <= M Iは++ ){
 57          のprintf(" %d個の\ n " 、Q [i]の.ans)。
58      }
 59     リターン 0 ;
60 }

 

おすすめ

転載: www.cnblogs.com/yinyuqin/p/11110794.html