题目链接

题目大意:

给定一个长度为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. dp小结|背包问题

    1.先放上0-1背包模板 二维数组 for(int i=1;i<=n;i++)//枚举 物品 for(int j=1;j<=V;j++)//枚举体积 //这个位置是可以正序枚举的. qwq ...

  2. docker 命令2

    docker build -t dvm.adsplatformproxy:v1.0.0 . #build images docker run -e WWNamespace=dev -e ZKServe ...

  3. Python GIL(Global Interpreter Lock)

    一.介绍 In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threa ...

  4. 文档对象模型DOM

    文档对象模型 DOM 1 DOM概述 1.1 什么是DOM 文档对象模型 Document Object Model 提供给用户操作document obj 的标准接口 文档对象模型 是表示和操作 H ...

  5. webpack插件配置(一) webpack-dev-server 路径配置

    本文的路径配置主要涉及到webpack.config.js文件中devServer与output两个选项的配置 webpack-dev-server定义 webpack-dev-server主要是启动 ...

  6. 关于set和map迭代器支持的运算

    问题: 曾经想遍历一个set遍历.当时是这样写的: set<int>::iterator b = a.begin()+1 后来发现程序报错.究其原因是,set迭代器不支持加减数操作. 查看 ...

  7. vs里32位项目和64位项目的区别

    由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件. 1.编译程序根据需要选择不同的编译环境. x86和win32为32位程序,x64为64位程序,可以选择不同的编译条件形成不同位 ...

  8. 小程序之取标签中内容 例如view,text

    // index.wxml页面 data-url为自定义 {{}}中内容可为后台请求到的数据 也可为固定内容例如:data-text="哈哈哈" data-url="ht ...

  9. 【Java】【事件处理机制】

    import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.Actio ...

  10. form提交不刷新,不跳转页面

    利用 iframe 标签 ,后台form处理可以返回void <form action="" method="post" target="nm_ ...