codevs 線段樹練習4

2021-07-16 08:08:49 字數 1429 閱讀 2231

題目描述:

給你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行每行若干個整數。如果第乙個數...