Codevs 4919 線段樹練習4

2021-07-31 02:15:08 字數 2789 閱讀 1260

4919 線段樹練習4

時間限制: 1 s 空間限制: 128000 kb 題目等級 : ** gold

題目描述 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

0 0

0 1

資料範圍及提示 data size & hint

10%:1

#include

#include

#include

using namespace std;

struct node*root=null;

int n,m,a[100010];

int init()

while(s>='0'&&s<='9')

if(f==1)return -x;return x;

}void sum_bage(node *cur)

void built(node *&cur,int l,int r)

int mid=(l+r)>>1;

built(cur->child[0],l,mid);

built(cur->child[1],mid+1,r);

sum_bage(cur);

}void down(node *cur)

for(int i=0;i<=6;i++)

cur->child[1]->s[(i+ cur->lazy)%7]=tmp[i];

cur->lazy = 0;

}int query(node* cur,int l,int r)

void change(node* cur,int l,int r,int

value)

if(cur->lazy) down(cur);

int mid=(cur->l + cur->r)>>1;

if(l>mid) change(cur->child[1],l,r,value);

else

if(r<=mid) change(cur->child[0],l,r,value);

else change(cur->child[0],l,mid,value),

change(cur->child[1],mid+1,r,value);

sum_bage(cur);

return ;

}int main()

else

if(ss[0]=='a')

}return

0;}

用s陣列表示 該區間內部 餘數為1、2、3…的分別有幾個,修改時開乙個臨時陣列,copy一下~~

陣列版:

#include#include#includeusing namespace std;

#define max 100000

struct nodetre[max<<2|1];

int read()

while(s>='0'&&s<='9')

return x*f;

}int n,m;

void sum(int

now)

void built(int

now,int l,int r)

intmid=(l+r) >> 1;

built(now

<<1,l,mid);

built(now

<<1|1,mid+1,r);

sum(now);

}void down(int

now)

for(int i=0;i<=6;i++)

tre[now

<<1|1].s[(i+tre[now].lazy)%7] = tmp[i];

tre[now].lazy = 0;

}int query(int

now,int l,int r)

void change(int

now,int l,int r,int p)

if(tre[now].lazy) down(now);

intmid=(tre[now].l + tre[now].r)>>1;

if(l>mid) change(now

<<1|1,l,r,p);

else

if(r<=mid) change(now

<<1,l,r,p);

else change(now

<<1,l,mid,p),

change(now

<<1|1,mid+1,r,p);

sum(now);

}int main()

else

if(str[0] == 'a')

}return 0;

}

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

codevs 線段樹練習4

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