線段樹練習4

2021-08-04 22:15:37 字數 2105 閱讀 5341

線段樹練習4

codevs題號: 4919

時間限制: 1 s

空間限制: 128000 kb

題目描述 description:

給你n個數,有兩種操作

1:給區間[a,b]內的所有數都增加x

2:詢問區間[a,b]能被7整除的個數

輸入描述 input description

第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數. 接下來q行每行若干個整數。如果第乙個數是add,後接3個正整數a,b,x,表示在區間[a,b]內每個數增加x,如果是count,表示統計區間[a,b]能被7整除的個數

輸出描述 output description

對於每個詢問輸出一行乙個答案

樣例輸入 sample input

3 2 3 4

6 count 1 3

count 1 2

add 1 3 2

count 1 3

add 1 3 3

count 1 3

樣例輸出 sample output

1 資料範圍及提示 data size & hint

100%:1< n<= 100000,1< q<= 100000

#include

#include

#include

using

namespace

std;

long

long

int a[200010],add[800010];

int n,m,x,y,v,pd,num=0;

struct hh

t[800010];

char pdd[10];

void build(int l,int r)

}

else

if(l==r)

}void pushdown(int i)//更新子節點的值

for(int j=0;j<7;j++)//再把更新後資料賦給節點的g陣列

t[t[i].ls].g[j]=s[j];

for(int j=0;j<7;j++)

for(int j=0;j<7;j++)//把更新後資料賦給節點的g陣列

t[t[i].rs].g[j]=s[j];

add[t[i].ls]+=va;

add[t[i].rs]+=va;

add[i]=0;

}}void update(int i,int l,int r,int value)

for(int j=0;j<7;j++)//再把更新後資料賦給節點的g陣列

t[i].g[j]=s[j];

return ;

}if(t[i].l==t[i].r) return ;

pushdown(i);//把延遲更新的值傳給子節點

int z=(t[i].l+t[i].r)/2;//區間更新的套路啦

if(r<=z) update(t[i].ls,l,r,value);

else

if(l>z) update(t[i].rs,l,r,value);

else

for(int j=0;j<7;j++)//父節點的g陣列的值就是子節點的g陣列的和

}long

long

int query(int i,int l,int r)//求和

pushdown(i);//降延遲更新的值傳給兒子節點

int z=(t[i].l+t[i].r)/2;//還是線段樹區間更新的套路

if(r<=z) return query(t[i].ls,l,r);

else

if(l>z) return query(t[i].rs,l,r);

else

return query(t[i].ls,l,z)+query(t[i].rs,z+1,r);

}int main()

build(1,n);

cin>>m;

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

else

if(pdd[0]=='c')

codevs 線段樹練習4

題目描述 給你n個數,有兩種操作 1 給區間 a,b 內的所有數都增加x 2 詢問區間 a,b 能被7整除的個數 輸入描述 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是add,後接3個正整數a,b,x,表示在區間 a,b 內每...

Codevs 4919 線段樹練習4

4919 線段樹練習4 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 內的所有數都增加x 2 詢問區間 a,b 能被7整除的個數 輸入描述 input description 第一行乙個正整數n,接下...

codevs 4919 線段樹練習4

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 內的所有數都增加x 2 詢問區間 a,b 能被7整除的個數 輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來...