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 }
时间: 2024-10-01 02:48:43

CodeVs——T 4919 线段树练习4的相关文章

4919 线段树练习4

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,

codevs 4919 线段树练习4

线段树水题.#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 100500 using namespace std; int n,a[maxn],m; int sum[maxn<<2][8],lazy[maxn<<2],tot=0,root,ls[maxn<<2],rs[maxn<<2];

codevs 1690 开关灯 线段树+延迟标记

1690 开关灯 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人陆续按下开关,这些开关可以改变从第i盏灯到第j盏灯的状态,现在YYX想知道,从第x盏灯到第y盏灯中有多少是亮着的(1<=i,j,x,y<=N) 输入描述 Input Description 第 1 行: 用空格隔开的两个整数N和

【codevs】1082 线段树练习 3

题目连接   http://codevs.cn/problem/1082/ Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. Input 第一行一个正整数n,接下来n行n个整数, 再接下来一个正整数Q,每行表示操作的个数, 如果第一个数是1,后接3个正整数, 表示在区间[a,b]内每个数增加X,如果是2, 表示操作2询问区间[a,b]的和是多少. 输出描述 Output Description 对于每个询问输出一行一个答案 S

codves 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]能被

[Codevs] 1080 线段树练习

1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或者减去一个特定的值A.现在要求你能对每个提问作出正确的回答.1≤N<100000,,提问和修改的总数m<10000条. 输入描述 Input Description 输入文件第一行为一个整

【树状数组区间修改区间求和】codevs 1082 线段树练习 3

http://codevs.cn/problem/1082/ [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=2e5+2; 5 int n; 6 ll a[maxn]; 7 ll c1[maxn]; 8 ll c2[maxn]; 9 int lowbit(int x) 10 { 11 return x&-x; 12 } 13 void add(l

1080 线段树练习 (codevs)

http://codevs.cn/problem/1080/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或者减去一个特定的值A.现在要求你能对每个提问作出正确的回答.1≤N<100000,,提问和修改的总数m<10000条. 输入描述 Input Des

线段树练习 codevs 1080

/* codevs 1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或者减去一个特定的值A.现在要求你能对每个提问作出正确的回答.1≤N<100000,,提问和修改的总数m<10000条. 输入描述 Input Des