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]大的数,设这个数 ...
随机推荐
- 倍数|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
思路:从l枚举到r肯定超时,这时我们要转变思路!题目让我们求一个区间内的d的倍数,只需要求出r/d - l/d就是区间内d倍数的个数. 代码: #include <iostream> us ...
- Windows常用的CMD命令
mspaint 打开画图 write 打开写字板 explorer 打开文件资源管理器 notepad 打开记事本 devmgmt.msc 打开设备管理器 regedit 打开注册表编辑器 Mscon ...
- 比原链设计思考: 扩展性UTXO模型
用户模型是比原链在最初就需要确定的重要数据结构, 团队的选择还是聚焦在两种典型的模型系统中,Account模型和UTXO模型,和其他大多数区块链设计一样, 选择了模型就决定了协议层的重要实现,两种模型 ...
- 什么情况下用断言?assert
可以再预计正常情况下不会到达的任何位置上放置断言,断言可以用于验证传递给私有方法的参数.不俺的参数过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数.不过,既 ...
- JqGrid 列时间格式化
{name:'createTime',index:'createTime',label:"创建时间", editable:false,formatter:"date&qu ...
- linux_nmon监控方法
一.介绍 Nmon 工具是 IBM 提供的免费的在AIX与各种Linux操作系统上广泛使用的监控与分析工具.该工具可将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工 ...
- 使用redux简单的实现加法运算(简单的状态改变)
描述该做啥?(action)!具体怎么做(reducer)!统一规划(store:包含reducer+所有的state) 上代码:index.ios.js import React, { Compon ...
- JS中什么是发布--订阅模式?
转载文章部分内容: 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. ...
- Codeforces 785 D. Anton and School - 2
题目链接:http://codeforces.com/contest/785/problem/D 我们可以枚举分界点,易知分界点左边和右边分别有多少个左括号和右括号,为了不计算重复我们强制要求选择分界 ...
- layout_gravity与gravity的区别,和padding margin的区别
https://blog.csdn.net/github_39688629/article/details/77790541