CF438D 线段树 区间求和,区间求膜,单点更新
题目大意:
给定一个长度为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 线段树 区间求和,区间求膜,单点更新的更多相关文章
- HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询
题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...
- 线段树 区间开方区间求和 & 区间赋值、加、查询
本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- Codevs-4919 线段树练习4(区间加上一个值并求摸个区间整除k的数的个数,线段树+数组维护)
给你N个数,有两种操作 1:给区间[a,b]内的所有数都增加X 2:询问区间[a,b]能被7整除的个数 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一 ...
- 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 ...
- cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈
/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...
随机推荐
- (转)renren-fast解读(一)
(二期)8.renren-fast项目解读(一) [课程八]预防xss...注入.xmind0.2MB [课程八预习]开...解读.xmind0.5MB 课程八_日志处理与...模块.xmind0.2 ...
- Android开发——去掉系统自带标题栏的几种方式
https://blog.csdn.net/qq_28585471/article/details/75991613 今天在练习自定义标题栏(Android初级开发(四)——补充3)的过程中遇到了隐藏 ...
- 什么是 Meta Learning / Learning to Learn ?
Learning to Learn Chelsea Finn Jul 18, 2017 A key aspect of intelligence is versatility – the cap ...
- 【.Net】结合项目谈谈多线程
提到多线程, 大家都知道, 在进程中启用多个线程进行工作, 会提升程序的效率等等. 本篇文章旨在解释多线程的基础概念之外, 还要结合实际的项目来谈多线程的具体使用. Thread 我们知道启动一个线程 ...
- 【C#】 Method invocation is skipped
相信大家看到这个标题也是一头雾水了. 这个问题主要是我在项目中遇到了一个问题, 然后我通过搜索引擎搜索的关键词进而找到了answer, 我先描述一下我遇到的问题: 做项目的时候我发现log时常没有输出 ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
本文为博主原创: 以下为在程序运行过程中报的错误, org.springframework.dao.CannotAcquireLockException: ### Error updating dat ...
- Wijmo 2017路线图
2016年是Wijmo团队发展和增长的另一个富有成效的一年.回顾我们2016年的路线图,您可以看到我们交付了我们承诺的一切.让我们回顾一下2016年的亮点: 我们第一个全面支持Angular 2 互操 ...
- BMv2 simple_switch 运行时切换P4程序
参考: [P4-dev] swapping p4 program using load_new_config and swap_configs commands BMv2 运行时切换P4程序 相关演示 ...
- 小文笔记 - phantomjs
小文笔记 - phantomjs 视频推荐: http://www.intalesson.com/compedium/phantom 2017-05-13 第一节:安装 Windows安装: 下载解压 ...
- QT使用QJson生成解析Json数据的方法
QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...