【問題描述】
假設有一列數 (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...