羅区P3948

  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 ;
}

 

 

 

 

おすすめ

転載: www.cnblogs.com/tombraider-shadow/p/11627116.html