線段樹練習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個整數,再接下來...