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...