题目链接

题目大意:

给定一个长度为n的序列,要求能够执行m次下列操作:

1.查询区间[l,r]的和

2.将区间[l,r]的每一个数%=mod

3.修改第x个数为y

操作1,3都是线段树的基本操作,线段树详细知识可以看看这篇大牛的文章   https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html

操作二取模如果一个个模那么复杂度为O(n*m),直接T,我们可以在线段树中同时维护一个最大值,如果一个区间的最大值比取模值要小,就可以不取模,否则的话递归左右子树,继续将每个区间

的最大值与取模值进行比较,一直不断缩小到单点,使需要取模的单点才取模,这样就不会T了

代码如下:

 #include <bits/stdc++.h>
using namespace std;
const int inf=<<;
typedef long long ll;
const double pi=acos(-);
const int mod=1e9+;
const int maxn=1e5+;
int n,m;ll ans;
struct node{
int l,r,maxx;ll v;
}tree[*maxn];
void modify(int k,int x,int y,int z){
if(tree[k].maxx<z) return ;
if(tree[k].l==tree[k].r){
tree[k].v%=z;tree[k].maxx=tree[k].v;
return ;
}
int m=(tree[k].l+tree[k].r)/;
if(x<=m) modify(*k,x,y,z);
if(y>m) modify(*k+,x,y,z);
tree[k].v=tree[k*].v+tree[*k+].v;
tree[k].maxx=max(tree[k*].maxx,tree[k*+].maxx);
}
void build(int l,int r,int k){
//important
tree[k].l=l,tree[k].r=r;
if(l==r){
scanf("%d",&tree[k].v);
tree[k].maxx=tree[k].v;
return ;
}
int m=(l+r)>>;
build(l,m,k*);
build(m+,r,k*+);
tree[k].v=tree[*k].v+tree[*k+].v;
tree[k].maxx=max(tree[*k].maxx,tree[*k+].maxx);
}
void sum(int k,int x,int y){
if(tree[k].l>=x&&tree[k].r<=y){
ans+=tree[k].v; //cout<<111<<endl;
return ;
}
int m=(tree[k].l+tree[k].r)/;
if(x<=m) sum(k*,x,y);
if(y>m) sum(k*+,x,y);
}
void change(int k,int x,int y){
if(tree[k].l==tree[k].r){
tree[k].v=y,tree[k].maxx=y;return;
}
int m=(tree[k].l+tree[k].r)/;
if(x<=m) change(k*,x,y);
else change(k*+,x,y);
tree[k].v=tree[*k].v+tree[*k+].v;
tree[k].maxx=max(tree[*k].maxx,tree[*k+].maxx);
}
int main(){
scanf("%d%d",&n,&m);
build(,n,);
while(m--){
int type,x,y,z;scanf("%d%d%d",&type,&x,&y);
if(type==){
ans=;
sum(,x,y);
printf("%lld\n",ans);
}
else if(type==){
scanf("%d",&z);
modify(,x,y,z);
}
else if(type==){
change(,x,y);
}
}
return ;
}

CF438D 线段树 区间求和,区间求膜,单点更新的更多相关文章

  1. HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询

    题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...

  2. 线段树 区间开方区间求和 & 区间赋值、加、查询

    本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...

  3. POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 140120 ...

  4. HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  6. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

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

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

  8. HDU 1698 Just a Hook (线段树模板题-区间求和)

    Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...

  9. cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈

    /* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...

随机推荐

  1. Concepts-->Migrations

    https://flywaydb.org/documentation/migrations Overview With Flyway all changes to the database are c ...

  2. spring boot + session+redis解决session共享问题

    自己没有亲自试过,不过看了下这个例子感觉靠谱,以后做了测试,在加以说明. PS:后期经验证,上面例子可行.我们平时存session里面的值,直接存在了redis里面了.

  3. 深度学习课程笔记(十)Q-learning (Continuous Action)

    深度学习课程笔记(十)Q-learning (Continuous Action) 2018-07-10 22:40:28 reference:https://www.youtube.com/watc ...

  4. Vue的生命周期(钩子函数)

    Vue一共有10个生命周期函数,我们可以利用这些函数在vue的每个阶段都进行操作数据或者改变内容. 其实在Vue的官网有一张图已经很好的诠释了生命周期,我在这里就不再多讲了,直接贴图,然后上程序代码. ...

  5. HDU 3333 Turing Tree(树状数组/主席树)

    题意 给定一个长度为 \(n​\) 的序列,\(m​\) 个查询,每次查询区间 \([L,R]​\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...

  6. 【ASP.NET】System.Web.Routing - StopRoutingHandler Class

    Provides a way to specify that ASP.NET routing should not handle requests for a URL pattern. ex: rou ...

  7. Kubernetes工作流之Pods一

    This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...

  8. Linux命令3——c

    cal:calender,显示月历 -j:用凯撒历(dates of julius caesar)的形式来显示月历,不分月份.1-365/366 -m:显示月历时,把星期一定为一周的开始.默认星期日为 ...

  9. sql server数据库自动备份

    SqlServer 数据库自动备份的两种解决方案 SQL Server中的角色(服务器级别和数据库级别角色) SqlServer服务器角色和数据库角色相关操作

  10. linux lsof/netstat查看进程和端口号相关命令:

    本文为博主原创,未经允许不得转载: 在linux操作时,经常要查看运行的项目的进程和端口号,在这里总结了以下常用到的相关命令: 1.查看系统运行的java项目,并查看进程号 这个用到的命令为: ps ...