题目描述 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 ",Query(1,1,n,x,y)); 81 } 82 return 0; 83 }