CodeVs——T 4919 线段树练习4

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 }

 

posted @ 2017-07-31 16:43  Aptal丶  阅读(170)  评论(0编辑  收藏  举报