4919 线段树练习4

 时间限制: 1 s
 空间限制: 128000 KB
 
 
 
题目描述 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

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

这道题的比较裸,需要思考的只有如何pushup和change信息。

对于线段树里存的元素是一个桶,记录这一段余数为1,2,3,4,5,6,0的分别有多少。

在pushup时只需将ls和rs的桶相加即可(代码11行)

在修改时则只需将数组内的是s[i]元素想右移动s[(i+a)%7]即可.

其他基本与普通线段树无异。

 #include<cstdio>
#include<cstring>
#define ls x<<1
#define rs x<<1|1
const int N=;
int lazy[N<<];
struct X
{
int s[];
X() {memset(s,,sizeof(s));};
void pu(const X &a,const X &b)
{
for(int i=;i<;i++)
s[i]=a.s[i]+b.s[i];
}
void gb(int x)
{
X t;
for(int i=;i<;i++) t.s[(i+x)%]=s[i];
*this=t;
}
}tree[N<<];
char c[];
void pd(int x)
{
if(lazy[x])
{
lazy[ls]+=lazy[x];
lazy[rs]+=lazy[x];
tree[ls].gb(lazy[x]);
tree[rs].gb(lazy[x]);
lazy[x]=;
}
}
void bu(int l,int r,int x)
{
if(l==r)
{
int a;
scanf("%d",&a);
tree[x].s[a%]=;
}
else
{
int mid=(l+r)>>;
bu(l,mid,ls);
bu(mid+,r,rs);
tree[x].pu(tree[ls],tree[rs]);
}
}
void chan(int l,int r,int x,int s,int ql,int qr)
{
if(ql<=l&&qr>=r) lazy[x]+=s,tree[x].gb(s);
else
{
int mid=(l+r)>>;
pd(x);
if(mid>=ql) chan(l,mid,ls,s,ql,qr);
if(qr>mid) chan(mid+,r,rs,s,ql,qr);
tree[x].pu(tree[ls],tree[rs]);
}
}
int ask(int l,int r,int x,int ql,int qr)
{
if(ql<=l&&qr>=r) return tree[x].s[];
else
{
int mid=(l+r)>>,re=;
pd(x);
if(mid>=ql) re+=ask(l,mid,ls,ql,qr);
if(qr>mid) re+=ask(mid+,r,rs,ql,qr);
tree[x].pu(tree[ls],tree[rs]);
return re;
}
}
int main()
{
int n,q;
scanf("%d",&n);
bu(,n,);
scanf("%d",&q);
while(q--)
{
scanf("%s",c);
if(c[]=='a')
{
int tj,l,r;
scanf("%d%d%d",&l,&r,&tj);
chan(,n,,tj,l,r);
}
else
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",ask(,n,,l,r));
}
}
return ;
}

codevs4919 线段树练习4的更多相关文章

  1. Codevs-4919 线段树练习4(区间加上一个值并求摸个区间整除k的数的个数,线段树+数组维护)

    给你N个数,有两种操作 1:给区间[a,b]内的所有数都增加X 2:询问区间[a,b]能被7整除的个数 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一 ...

  2. 【codevs4919】线段树练习4

    题目大意:维护一个长度为 N 的序列,支持两种操作:区间加,区间查询有多少数是 7 的倍数. 题解:在每个线段树中维护一个权值数组 [0,6],由于个数显然支持区间可加性,因此可用线段树来维护. 代码 ...

  3. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  4. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  8. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  9. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

随机推荐

  1. Jqgrid 数据格式化配置

    默认格式化 $jgrid = { formatter : { integer : {thousandsSeparator: " ", defaultValue: '0'}, num ...

  2. zoj3551 Bloodsucker ——概率DP

    Link: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 A[i]数组表示当吸血鬼有 I 个的时候,还需要的天数.可以 ...

  3. [NOIP2009] 靶形数独(搜索+剪枝)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  4. LeetCode 【235. Lowest Common Ancestor of a Binary Search Tree】

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  5. each循环

    var NA_COUNT=0; var NG_OK_COUNT=0; //获取所有检验明细为同一个编号的下拉选项,看有没有不是N/A的下拉选项 $("#@(Perfix)tbData sel ...

  6. filter and listener

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Serv ...

  7. 【学】CSS3基础实例1 - 用CSS3做网页中的小三角,以及transition的用法

    自开了博客园已经有2周了吧,虽然转载了一些觉得比较有用的文章之外还没有开始写自己的一些学习记录,那就从今天开始. 目前看了妙味的不少视频,有css+html,js的基础和中级也都看完了,作业也都做了, ...

  8. JVM垃圾回收参数说明整理

    java -Xms4g -Xmx4g -Xmn3g -Xss256k -server -XX:PermSize=64M -XX:MaxPermSize=64M -XX:+UseConcMarkSwee ...

  9. UVA 1395 苗条的生成树(最小生成树+并查集)

    苗条的生成树 紫书P358 这题最后坑了我20分钟,怎么想都对了啊,为什么就wa了呢,最后才发现,是并查集的编号搞错了. 题目编号从1开始,我并查集编号从0开始 = = 图论这种题真的要记住啊!!题目 ...

  10. 51nod 1471 小S的兴趣 sqrt

    小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题有两种类型: 1.      在数组下标 ...