題目描述:
給你n個數,有兩種操作
1:給區間[a,b]內的所有數都增加x
2:詢問區間[a,b]能被7整除的個數
輸入描述:
第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數. 接下來q行每行若干個整數。如果第乙個數是add,後接3個正整數a,b,x,表示在區間[a,b]內每個數增加x,如果是count,表示統計區間[a,b]能被7整除的個數
輸出描述:
對於每個詢問輸出一行乙個答案
樣例輸入:
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
樣例輸出:
0 0 0 1
資料範圍:1<=n,q<=100000
題解:
很簡單的線段樹練習,給線段樹的每乙個節點開乙個小陣列g[i]表示這個節點表示的區間內的所有數對7取模的結果為i的數有多少個。然後就跟普通的線段樹一樣做咯。
#include
#include
#include
#include
#include
#include
#define liangjiajun main
using namespace std;
int n,q;
int a[100004];
struct datatr[400004];
void build(int k,int l,int r)
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
for(int i=0;i<7;i++)
tr[k].g[i]=tr[k<<1].g[i]+tr[k<<1|1].g[i];
}void update(int k,int pd)
void push(int k)
void add(int k,int a,int b,int w)
if(tr[k].tag)push(k);
int mid=(l+r)>>1;
if(b<=mid)add(k<<1,a,b,w);
else
if(a>mid)add(k<<1|1,a,b,w);
else
for(int i=0;i<7;i++)
tr[k].g[i]=tr[k<<1].g[i]+tr[k<<1|1].g[i];
}int query(int k,int a,int b)
}int liangjiajun()
else
}return
0;}
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個整數,再接下來...
codevs 4919 線段樹練習4
題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 內的所有數都增加x 2 詢問區間 a,b 能被7整除的個數 輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數...