1. 程式人生 > >CodeVs——T 4919 線段樹練習4

CodeVs——T 4919 線段樹練習4

uil flag i++ success tar get struct 空間 none

http://codevs.cn/problem/4919/

時間限制: 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<N<=10,1<Q<=10

30%:1<N<=10000,1<Q<=10000

100%:1<N<=100000,1<Q<=100000

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 const int N(100000+5);
 7 int n,x,y,z,q;
 8 
 9 #define lc (now<<1)
10 #define rc (now<<1|1)
11 #define mid (l+r>>1)
12 struct AC_Tree
13 {
14     int val[7],flag;
15 }tree[N<<2
]; 16 inline void pushup(int now) 17 { 18 for(int i=0;i<7;i++) 19 tree[now].val[i]=tree[lc].val[i]+tree[rc].val[i]; 20 } 21 inline void pushdown(int now) 22 { 23 int temp[7],flag=tree[now].flag; tree[now].flag=0; 24 tree[lc].flag+=flag; tree[rc].flag+=flag; 25 for(int i=0;i<7;i++) temp[i]=tree[lc].val[i]; 26 for(int i=0;i<7;i++) tree[lc].val[((i+flag)%7)]=temp[i]; 27 for(int i=0;i<7;i++) temp[i]=tree[rc].val[i]; 28 for(int i=0;i<7;i++) tree[rc].val[((i+flag)%7)]=temp[i]; 29 } 30 void Build(int now,int l,int r) 31 { 32 if(l==r) 33 { 34 scanf("%d",&x); 35 tree[now].val[x%7]++; 36 return ; 37 } 38 Build(lc,l,mid); 39 Build(rc,mid+1,r); 40 pushup(now); 41 } 42 void Change(int now,int l,int r,int L,int R,int x) 43 { 44 if(l==L&&r==R) 45 { 46 int temp[7]; 47 tree[now].flag+=x; 48 for(int i=0;i<7;i++) temp[i]=tree[now].val[i]; 49 for(int i=0;i<7;i++) tree[now].val[(i+x)%7]=temp[i]; 50 return ; 51 } 52 if(tree[now].flag) pushdown(now); 53 if(R<=mid) Change(lc,l,mid,L,R,x); 54 else if(L>mid) Change(rc,mid+1,r,L,R,x); 55 else Change(lc,l,mid,L,mid,x),Change(rc,mid+1,r,mid+1,R,x); 56 pushup(now); 57 } 58 int Query(int now,int l,int r,int L,int R) 59 { 60 if(l==L&&r==R) return tree[now].val[0]; 61 if(tree[now].flag) pushdown(now); 62 if(R<=mid) return Query(lc,l,mid,L,R); 63 else if(L>mid) return Query(rc,mid+1,r,L,R); 64 else return Query(lc,l,mid,L,mid)+Query(rc,mid+1,r,mid+1,R); 65 } 66 67 int main() 68 { 69 scanf("%d",&n); 70 Build(1,1,n); 71 scanf("%d",&q); 72 for(char s[5];q--;) 73 { 74 scanf("%s%d%d",s,&x,&y); 75 if(s[0]==a) 76 { 77 scanf("%d",&z); 78 Change(1,1,n,x,y,z); 79 } 80 else printf("%d\n",Query(1,1,n,x,y)); 81 } 82 return 0; 83 }

CodeVs——T 4919 線段樹練習4