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. LintCode Binary Tree Inorder Traversal

    Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...

  2. Android——手机内部文件存储(作业)

    作业:把用户的注册信息存储到文件里,登录成功后读出并显示出来 activity_practice2的layout文件: <?xml version="1.0" encodin ...

  3. maven docker 操作

    1. 使用dokerfile 进行构建 创建dockerfile 2. maven 插件 <plugin> <groupId>com.spotify</groupId&g ...

  4. 完成一段简单的Python程序,使用函数实现用来判断输入数是偶数还是奇数

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,使用函数实现用来判断偶数和奇数'''def number_deal(a): if a%2==0 ...

  5. Android AChartEngine 去除折线图黑边

    通常使用AChartEngine画出的折线图,如果背景不是黑色,则会在折线图的坐标轴旁边出现黑边,如图所示: 试了好多设置,最后终于发现,去除黑边的设置是: mRenderer.setMarginsC ...

  6. Mysql 存储过程+定时任务,完成分区自动维护

    建表: drop table if exists terminal_parameter; CREATE TABLE `terminal_parameter` ( `terminal_parameter ...

  7. Couchbase之个人描述及入门示例

    本文不打算抄袭官方或者引用他人对Couchbase的各种描述,仅仅是自己对它的一点理解(错误之处,敬请指出),并附上一个入门示例. ASP.NET Web项目(其他web开发平台也一样)应用规模小的时 ...

  8. centos 下Supervisor 守护进程基本配置

    supervisor:C/S架构的进程控制系统,可使用户在类UNIX系统中监控.管理进程.常用于管理与某个用户或项目相关的进程. 组成部分supervisord:服务守护进程supervisorctl ...

  9. (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除

    //JS实现顾客浏览商品的记录以及实现购物车的功能function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.s ...

  10. PaintCode调研

    1.   背景 PaintCode是一款面向iOS和Mac应用开发者及设计师的矢量图形可视化开发工具.它可以让设计师把设计好的psd文件直接导入该工具,然后生成用Quartz 2D 产生的object ...