cogs240 數列操作 線段樹

2021-07-04 03:18:48 字數 1452 閱讀 3508

【問題描述】

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

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

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

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

【輸入格式】

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

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

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

sum s t (表示輸出 as +…+at )

【輸出格式】

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

【輸入輸出樣例】

輸入:

41 4 2 3 

3sum 1 3 

add 2 50

sum 2 3

輸出:7

56題解:線段樹裸題。

#include#includeusing namespace std;

int tree[1000001],n,a[1000001],m,s,t,k,d;

char ch[101];

void build(int k,int l,int r)

mid=(l+r)/2;

build(k*2,l,mid);

build(k*2+1,mid+1,r);

tree[k]=tree[k*2]+tree[k*2+1];

}void add(int k,int l,int r,int a,int d)

mid=(l+r)/2;

if (a<=mid) add(k*2,l,mid,a,d);

else add(k*2+1,mid+1,r,a,d);

tree[k]=tree[k*2]+tree[k*2+1];

}int query(int k,int l,int r,int ll,int rr)

mid=(l+r)/2;

if (ll<=mid) ans+=query(k*2,l,mid,ll,rr);

if (rr>mid) ans+=query(k*2+1,mid+1,r,ll,rr);

return ans;

} int main()

for (int i=1;i<=n;i++) scanf("%d",&a[i]);

build(1,1,n);

scanf("%d",&m);

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

if (ch[0]=='a')

}}

cogs2638 數列操作 雙標記線段樹

題目大意 給定乙個數列a,你需要支援的操作 區間and,區間or,詢問區間最大值 解題關鍵 1 雙標記線段樹,注意優先順序 超時 當涉及多重標記時,定義出標記的優先順序,修改操作時用優先順序高 先下放 的修正優先順序低 後下放 的來保證標記的正確性。同時維護了區間and,區間or include i...

線段樹 數列操作

假設有一列數 1 i n 支援如下兩種操作 1 將 ak 的值加 d k,d 是輸入的數 2 輸出 as as 1 at s,t 都是輸入的數,s t 根據操作要求進行正確操作並輸出結果。輸入格式 輸入檔案第一行乙個整數n 0 n 100000 第二行為 n 個整數,表示 的初始值。第三行為乙個整數...

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