P3498データ構造
トピックへのリンク:https://www.luogu.org/problem/P3948
タイトル効果:長さnのあなたアレイ、およびmは各々二つの操作を求め、この問い合わせの始まりを有し、LとRプラスX、または要素の値との間のデータは、rにクエリLの間であります掛け
モジュロ・インデックスの後に最大数未満の最小値よりも大きいです。最後OPT質問時間があり、それぞれは、LとRとの間の上記条件問い合わせ番号を満たします
問題解決のアイデア:私たちはこの質問を解決するために、差分配列を考慮することができるので、前の照会での処理をm回は、両方のお問い合わせは、変更されているが、毎回クエリはしていません
直接配列内の値を変更し、これが後で生成された結果に影響を与えるので、現在記録された値Xを持つクエリを照会することができる場合、以前のm個のクエリが完了した後、それは答えを蓄積することができますアレイSUM [i]はI記録場所に条件数を満たします
番号(プレフィックスやアイデア)
差分アレイは:レコード差の配列がi番目の位置およびI-1の位置、すなわち、CNT [I]との差である[I] -a [I-1]、得ることが可能である[I] = = CNT [I] + [I-1]、これだけ時間がトラバース再びそれを見つける必要があります
配列内の値
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 2E5 + 1 ; 長い 長いNUM [MAXN]、合計[MAXN]。 長い 長いミネソタ州、MAXX、モード、N、T。 空アドオン() { 長い 長L、R、X。 CIN >> L >> R >> X。 か[I] + = X。 [Rか + 1 ] - =のX。 } 空のカウント() { 長い 長L、R。 長い 長いのx = 0、年齢= 0 ; CIN >> L >> R。 以下のために(int型 I = 1 ; I <= R; iは++ ) { // coutの<< X <<てendl; X + = NUM [I]。 もし(((X * I)%のモード> =ミネソタ州)&&((X * I)%のモード<= MAXX && I> = 1))++ ANS 。 } coutの << ANS << てendl; } int型のmain() { CIN >> N >> T >>モード>>ミネソタ>> MAXX。 しばらく(t-- ) { チャー S [ 5 ]。 scanf関数(" %sの" 、S); もし(S [ 0 ] == ' A ' )(ADD)。 他の 数(); } 以下のために(int型 i = 1 ; iが<= N; iは++します) { NUM [I] + = NUM [I- 1 ]。 もし(((NUM [I] * I)%のモード> =ミネソタ州)&&((NUM [I] * I)%モード<= MAXX))和[I] ++ ; 和[I] + =和[I- 1 ]。 } int型のOPT。 cinを >> 選びます。 しばらく(opt-- ) { あなたが持っていると、に。 CIN >> L >> R。 COUT <<和[R] -sum 1- [ 1 ] << ENDL。 } リターン 0 ; }