给你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

题解:和普通线段树区间修改以及区间求和差不多,只是我们这里用数组来存储每个区间对 K取余后的数的每个的数量即可;其他操作和普通线段树相同;

参考代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const LL inf=0x3f3f3f3f3f3f3f3fLL;
const int maxn=1e5+;
int n,q,c[maxn],a,b,x,temp[];
string str; struct Node{
int l,r,tag,mod[];
} tree[maxn<<]; void build(int pos,int l,int r)
{
tree[pos].l=l,tree[pos].r=r,tree[pos].tag=;
for(int i=;i<;i++) tree[pos].mod[i]=;
if(l==r)
{
tree[pos].mod[c[l]%]=;
return ;
}
int mid=(tree[pos].l+tree[pos].r)>>;
build(pos<<,l,mid);
build(pos<<|,mid+,r);
for(int i=;i<;i++) tree[pos].mod[i]=tree[pos<<].mod[i]+tree[pos<<|].mod[i];
} void change(int pos,int x)
{
for(int i=;i<;i++) temp[(i+x)%]=tree[pos].mod[i];
for(int i=;i<;i++) tree[pos].mod[i]=temp[i];
} void pushup(int pos)
{
for(int i=;i<;i++)
tree[pos].mod[i]=tree[pos<<].mod[i]+tree[pos<<|].mod[i];
} void pushdown(int pos)
{
if(tree[pos].l==tree[pos].r) return ;
tree[pos<<].tag+=tree[pos].tag;
tree[pos<<|].tag+=tree[pos].tag;
change(pos<<,tree[pos].tag),change(pos<<|,tree[pos].tag);
tree[pos].tag=;
} void update(int pos,int l,int r,int x)
{
if(tree[pos].tag) pushdown(pos);
if(tree[pos].l==l&&tree[pos].r==r)
{
tree[pos].tag+=x;change(pos,x);
return ;
}
int mid=(tree[pos].l+tree[pos].r)>>;
if(r<=mid) update(pos<<,l,r,x);
else if(l>=mid+) update(pos<<|,l,r,x);
else update(pos<<,l,mid,x),update(pos<<|,mid+,r,x);
pushup(pos);
} int query(int pos,int l,int r)
{
if(tree[pos].tag) pushdown(pos);
if(tree[pos].l==l&&tree[pos].r==r) return tree[pos].mod[];
int mid=(tree[pos].l+tree[pos].r)>>;
if(r<=mid) return query(pos<<,l,r);
else if(l>=mid+) return query(pos<<|,l,r);
else return query(pos<<,l,mid)+query(pos<<|,mid+,r);
} int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++) cin>>c[i];
build(,,n);
cin>>q;
while(q--)
{
cin>>str;
if(str[]=='a')
{
cin>>a>>b>>x;
update(,a,b,x);
}
else if(str[]=='c')
{
cin>>a>>b;
cout<<query(,a,b)<<endl;
}
} return ;
}

Codevs-4919 线段树练习4(区间加上一个值并求摸个区间整除k的数的个数,线段树+数组维护)的更多相关文章

  1. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  2. 求序列A中每个数的左边比它小的数的个数(树状数组)

    给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) #include <i ...

  3. SPOJ DQUERY 求区间内不同数的个数 主席树

    这题跟HDU3333差不多吧. 离线的做法很简单,不再说了 以前做过. 主席树的做法就比较暴力了.. 什么是主席树呢.. 其实是某种称号. 在该题中的体现是可持久化的线段树. 对于一个数 如果以前没出 ...

  4. 获取验证码的URL后边为什么要加上一个值不断变化的参数?

    $(function(){ $("#change").click(function(){ //修改src属性 $("#imgCode").attr(" ...

  5. Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)

    题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...

  6. 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!

    D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...

  7. 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)

    [题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...

  8. 主席树总结(经典区间第k小问题)(主席树,线段树)

    接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...

  9. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

随机推荐

  1. 201871010114-李岩松《面向对象程序设计(java)》第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  2. servlet三大组件

    servlet大致可以分为三个:简单servlet.过滤servlet.监听servlet servlet: servlet的创建 创建一个类并实现Servlet接口. 重写service方法. 在服 ...

  3. 监听器以及在监听类里面获得bean的方法

    1实现HttpSessionListener和ServletContextListener,2个接口 2然后在contextInitialized初始化方法里面: ServletContext app ...

  4. nyoj 29-求转置矩阵问题 (行,列位置调换)

    29-求转置矩阵问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:8 submit:18 题目描述: 求一个三行三列的转置矩阵. 输入描述: 第一 ...

  5. nyoj 463-九九乘法表

    463-九九乘法表 内存限制:64MB 时间限制:1000ms 特判: No 通过数:16 提交数:41 难度:1 题目描述: 小时候学过的九九乘法表也许将会扎根于我们一生的记忆,现在让我们重温那些温 ...

  6. 【Vue | ElementUI】Vue离开当前页面时弹出确认框实现

    Vue离开当前页面时弹出确认框实现 1. 实现目的 在某种业务场景下,用户不允许跳转到其他页面.于是,需要在用户误操作或者是点击浏览器跳转时提示用户. 2. 实现原理 使用路由守卫beforeRout ...

  7. windows下安装Apache、php、mysql集成环境

    一.准备工作 本次安装的版本分别为:apache2.4  .php5.6 . mysql5.7 下载地址为:http://pan.baidu.com/s/1boQNIOn 密码:zarx 二.安装步骤 ...

  8. Session,Token,Cookie相关区别

    1. 为什么要有session的出现? 答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的.如果要进行类似论坛登陆相关的操作,就实现不 ...

  9. 扛把子组20191107-4 beta week 2/2 Scrum立会报告+燃尽图 03

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9956 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  10. Kubernetes权威指南 第一章:Kubernetes入门

    Kubernetes是什么 官网 https://kubernetes.io/ 中文版:https://kubernetes.io/zh/ Kubernetes是谷歌十几年大规模容器管理经验的成果 是 ...