COGS 數列操作a,b,c 樹狀陣列練習

2021-08-01 12:39:18 字數 3973 閱讀 7766

cogs 264.數列操作

【問題描述】

假設有一列數 (1 ≤ i ≤ n) ,支援如下兩種操作:

(1)將 a k 的值加 d 。( k, d 是輸入的數)

(2) 輸出 a s +a s+1 +…+a t 。( s, t 都是輸入的數, s ≤ t )

根據操作要求進行正確操作並輸出結果。

【輸入格式】

輸入檔案第一行乙個整數 n(0<=n<=100000) , 第二行為 n 個整數,表示 的初始值。

第三行為乙個整數 m(0<=m<=150000) ,表示運算元。 下接 m 行,每行描述乙個操作,有如下兩種情況:

add k d ( 表示將 a k 加 d , 1<=k<=n , d 為整數 )

sum s t (表示輸出 a s +…+a t )

【輸出格式】

對於每乙個 sum 提問,輸出結果

【輸入輸出樣例】

輸入:

4 1 4 2 3

3 sum 1 3

add 2 50

sum 2 3

輸出:

7 56

單點修改,單點查詢:

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 100001

#define lowbit(x) x&(-x)

int n, m, x, y;

int a[maxn], c[maxn];

char s[4];

void update(int p, int x) //更新

int ask(int p) //詢問

int main()

scanf("%d", &m);

while(m--)

return

0;}

cogs 1316 數列操作b

【問題描述】

假設有一列數 (1 ≤ i ≤ n),n<=100000 ,支援如下兩種操作:

(1)將 a i至a j 的值均增加 d 。( i,j,d 是輸入的數)

(2) 輸出 ai 。( i是輸入的數, i ≤ n )

根據操作要求進行正確操作並輸出結果。

【輸入格式】

輸入檔案第一行乙個整數 n ,

第二行為 n 個整數,表示 的初始值。

第三行為乙個整數 m ,表示運算元。 下接 m 行,每行描述乙個操作,有如下兩種情況:

add i j d ( 表示將 a i至a j 的值均增加 d , 1<=i,j<=n , d 為整數 )

query s (表示輸出 a s)

【輸出格式】

對於每乙個 query 提問,輸出結果

【輸入輸出樣例】

輸入:

shulieb.in

4 1 4 2 3

3 query 1

add 2 2 50

query 2

輸出:

shulieb.out

1 54

區間修改,單點詢問

引入差分陣列 c[

i]=a

[i]−

a[i−

1]則有 a[

x]=∑

xi=1

c[i]

[x,y]區間+a:

c[x]+=a, c[y+1]-=a

(查詢小於x數 不影響;查詢區間內 +a;查詢大於y數 +a-a=0 不影響)

#include

#include

#include

#include

#include

using

namespace

std;

#define lowbit(x) x&(-x)

int a, b, k, tmp, n, m;

int c[400001];

char ch[6];

void add(int p, int x)

}void add(int p, int x) //右端點

}int ask(int p)

return t;

}int main()

scanf("%d", &m);

for(int i=1; i<=m; i++)

scanf("%d%d%d", &a, &b, &k);

add(a, k); add(b+1, k); //我幹嘛要寫兩個函式...

}return

0;}

cogs 1317 數列操作c

所有答案小於4611686018427387904

【問題描述】

假設有一列數 (1 ≤ i ≤ n),n<=100000 ,支援如下兩種操作:

(1)將 a i至a j 的值均增加 d 。( i,j,d 是輸入的數)

(2) 輸出 a s +a s+1 +…+a t 。( s, t 都是輸入的數, s ≤ t )

根據操作要求進行正確操作並輸出結果。

【輸入格式】

輸入檔案第一行乙個整數 n ,

第二行為 n 個整數,表示 的初始值。

第三行為乙個整數 m ,表示運算元

v 下接 m 行,每行描述乙個操作,有如下兩種情況:

add i j d ( 表示將 a i至a j 的值均增加 d , 1<=i,j<=n , d 為整數 )

sum s t (表示輸出 a s +…+a t )

【輸出格式】

對於每乙個 sum 提問,輸出結果

【輸入輸出樣例】

輸入:

shuliec.in

4 1 4 2 3

3 sum 1 3

add 2 2 50

sum 2 3

輸出:

shuliec.out

7 56

仍然需要差分陣列,先設c1

[i]=

a[i]

−a[i

−1]

現在需要求∑x

i=1a

[i]

有∑i=

1xa[

i]=∑

i=1x

∑j=1

ic1[

j]=∑

i=1x

(x−i

+1)∗

c1[i

] 化簡即(x+

1)∑i

=1xc

1[i]

−∑i=

1xi∗

c1[i

] 需要對i∗c

1[i]

維護,令其為c2

[i]=

i∗c1

[i]

#include

#include

#include

#include

#include

using

namespace

std;

#define lowbit(x) x&(-x)

#define ll long long

ll a, b, k, n, m;

ll c1[100001], c2[100001];

char ch[5];

void add(int p, ll x)

ll sum(int p)

int main()

scanf("%d", &m);

for(int i=1; i<=m; i++)

scanf("%d%d", &a, &b);

printf("%lld\n", sum(b)-sum(a-1));

}return

0;}

樹狀陣列 數列操作

題目描述 給定n個數列,規定有兩種操作,一是修改某個元素,二是求子數列 a,b 的連續和。數列的元素個數最多10萬個,詢問操作最多10萬次。輸入第一行2個整數n,m n表示輸入n個數列,m表示有m個操作 第二行輸入n個數列。接下來m行,每更好行有三個數k,a,b k 0表示求子數列 a,b 的和,k...

COGS 2964 數列操作

傳送門 題目描述 給定長度均為 n nn 的數列 a,b a,ba,b,其中 b bb 數列為 1 11 n nn 的全排列,a aa 數列全為 000。你需要支援 q qq 次操作,操作分為 add addad d 和 que ry query quer y 兩種。其中 x x x 表示對 x x...

COGS2638 數列操作

給定乙個數列a,你需要支援的操作 區間and,區間or,詢問區間最大值 一行兩個整數n,m,表示數列長度和操作個數。接下來一行有n個整數,第i個數表示ai。接下來m行,每一行均為以下三種操作中的一種 1 l r val ai ai and val l i r 2 l r val ai ai or v...