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. 如何在 Linux 终端中知道你的公有 IP

    导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...

  2. 【 D3.js 入门系列 --- 2 】 如何使用数据和选择元素

    接着上一讲的内容,这次讨论如何选择元素和使用数据.    现在页面中有三行文字,代码为: <p>Hello World 1</p> <p>Hello World 2 ...

  3. 大道至简---软件工程实践者的思想------------java伪代码形式读后感第一章

    import.java.大道至简.*; 1.编程的精义----愚公移山 /* 原始需求的产生:惩山北之塞,出入之迂 项目沟通的基本方式:聚室而谋曰 项目的目标:毕力平险,指通豫南,达于汉阴 技术方案: ...

  4. javaScript DOM JQuery AJAX

    http://www.cnblogs.com/wupeiqi/articles/5369773.html 一 JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript ...

  5. How to relocate tablespace directory

    I’ll demonstrate how to relocate a tablespace directory without the reconstruction of databases. I h ...

  6. 【xargs使用】查询包含某字符串的所有文件

    在initrd目录下,查找包含"Loading virtio.ko"的所有文件 cd initrd find . | xargs grep "Loading virtio ...

  7. How to Failover the ‘Cluster Group’

    If you have more than two nodes in the cluster, you can specify the destination node with the follow ...

  8. [家里蹲大学数学杂志]第033期稳态可压Navier-Stokes方程弱解的存在性

    1. 方程  考虑 $\bbR^3$ 中有界区域 $\Omega$ 上如下的稳态流动: $$\bee\label{eq} \left\{\ba{ll} \Div(\varrho\bbu)=0,\\ \ ...

  9. oracle数据库如何创建角色并对角色授予权限

    目标: 1.创建角色test1_role, 授予create session 权限 2.创建角色test2_role,授予create procedure, create sequence, crea ...

  10. [ActionScript 3.0] AS3.0 火焰效果

    package { import flash.display.Sprite; import flash.display.* import flash.events.Event; import flas ...