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. android使用Webview上传图片

    package com.example.webview; import java.io.File; import android.net.Uri;import android.os.Bundle;im ...

  2. Generator 函数学习笔记

    // 使用 function* 定义一个 generator 函数 function* helloWorldGenerator() { yield 'hello'; // yield 关键字作为暂停的 ...

  3. oracle 查询数据库表空间大小和剩余空间

    dba_data_files:数据库数据文件信息表.可以统计表空间大小(总空间大小). dba_free_space:可以统计剩余表空间大小. 增加表空间即向表空间增加数据文件,表空间大小就是数据文件 ...

  4. 使Maven 2在package、install等阶段跳过运行Test的配置

    方法1: To skip running the tests for a particular project, set the skipTests property to true.<proj ...

  5. ServletContext总结

    今天我们学习的是ServletContext的应用. WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用. ServletConfig对 ...

  6. WebApi:过滤器的种类

    WebApi:筛选器的种类 授权筛选器:这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策.AuthorizeAttrib ...

  7. ZooKeeper程序员指南(转)

    译自http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 1 简介 本文是为想要创建使用ZooKeeper协调服务优势的分布式 ...

  8. Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation)

    在本系列的上一篇文章中,我们讲到了使用动态代理的方式完成事务处理,这种方式将service层的所有public方法都加入到事务中,这显然不是我们需要的,需要代理的只是那些需要操作数据库的方法.在本篇中 ...

  9. 【原】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)下.md

    之前看到智能社主页的那个骰子样式的钟表,最近研究了一下,虽然没有仔细看他是怎么做的,但是学了css3的动画之后想自己尝试着写一下,用到的原理可能和智能社网站的不太一样,我自己主要用到了css3和js. ...

  10. 大型博彩公司招聘 .net,DB,tester,android

    大型博彩公司招聘 .net,DB,tester,android,ios等. 等拿完年终奖的朋友,可以先发简历给我,先面试,年后上班. emai:sjchen1203@126.com 要求: 1. 全职 ...