AcWing242。単純な整数問題の差+ツリー配列

AcWing242。単純な整数問題

長さNの数列Aが与えられた場合、操作命令のM行を入力します。

最初のタイプの命令は「Clrd」の形式です。これは、シーケンス内のすべてのl〜r番号にdを追加することを意味します。

2番目のタイプの命令は、「QX」の形式です。これは、クエリシーケンスのx番目の数値の値を意味します。

クエリごとに、答えを示す整数を出力します。

入力形式
最初の行には、2つの整数NとMが含まれています。

2行目には、N個の整数A [i]が含まれています。

次のM行はM命令を表し、各命令の形式はタイトルの説明に示されています。

出力形式
クエリごとに、回答を表す整数が出力されます。

各回答は1行を占めます。

データ範囲
1≤N、M≤105、
| d |≤10000、
| A [i] |≤1000000000
入力例:

10 5
1 2 3 4 5 6 7 8 9 10
Q 4
Q 1
Q 2
C 1 6 3
Q 2

サンプル出力:

4
1
2
5

この質問は、タイトルに記載されている単純な整数の問題です。数値とは何かを尋ねましょう。この問題を解決するために、差分とツリー配列を使用します。追加とクエリが高速であるため、ツリー配列を使用する理由。

コードは次のように表示されます。

#include<iostream>

using namespace std;

typedef long long LL;

const int N=1e5+10;

LL trie[N],a[N];
int n,m;

int lowbit(int x)
{
    
    
    return x&(-x);
}

void add(int k,int v)
{
    
    
    for(int i=k;i<=n;i+=lowbit(i)) trie[i]+=v;
}

LL query(int k)
{
    
    
    LL res=0;
    for(int i=k;i;i-=lowbit(i))
    res+=trie[i];
    return res;
}

int main(void)
{
    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
    {
    
    
        cin>>a[i];
        add(i,a[i]-a[i-1]);
    }
    while(m--)
    {
    
    
        char op;
        cin>>op;
        if(op=='Q')
        {
    
    
            int t;
            cin>>t;
            cout<<query(t)<<endl;
        }
        else
        {
    
    
            int l,r,v;
            cin>>l>>r>>v;
            add(l,v);add(r+1,-v);
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_52358098/article/details/114237052