Codeves 4279 线段树练习5
有n个数和5种操作
add a b c:把区间[a,b]内的所有数都增加c
set a b c:把区间[a,b]内的所有数都设为c
sum a b:查询区间[a,b]的区间和
max a b:查询区间[a,b]的最大值
min a b:查询区间[a,b]的最小值
第一行两个整数n,m,第二行n个整数表示这n个数的初始值
接下来m行操作,同题目描述
对于所有的sum、max、min询问,一行输出一个答案
10 6
3 9 2 8 1 7 5 0 4 6
add 4 9 4
set 2 6 2
add 3 8 2
sum 2 10
max 1 7
min 3 6
49
11
4
10%:1<n,m<=10
30%:1<n,m<=10000
100%:1<n,m<=100000
保证中间结果在long long(C/C++)、int64(pascal)范围内
题解:线段树基本操作,区间修改,区间加,区间求最大,最小值;
参考代码:
- #include<cstdio>
- #include<algorithm>
- #define N 100001
- using namespace std;
- int n,m,x,y;
- long long z;
- long long ans;
- struct node
- {
- int l,r,siz;
- long long set,add,minn,maxn,sum;
- bool v;
- }tr[N*];
- void up(int k)
- {
- tr[k].sum=tr[k<<].sum+tr[k<<|].sum;
- tr[k].maxn=max(tr[k<<].maxn,tr[k<<|].maxn);
- tr[k].minn=min(tr[k<<].minn,tr[k<<|].minn);
- }
- void build(int k,int l,int r)
- {
- tr[k].l=l; tr[k].r=r; tr[k].siz=r-l+;
- if(l==r)
- {
- scanf("%d",&x);
- tr[k].sum=tr[k].maxn=tr[k].minn=x;
- return ;
- }
- int mid=l+r>>;
- build(k<<,l,mid);
- build(k<<|,mid+,r);
- up(k);
- }
- void down_set(int k)
- {
- int l=k<<,r=k<<|;
- tr[l].add=tr[r].add=;
- tr[l].set=tr[r].set=tr[k].set;
- tr[l].v=tr[r].v=true;
- tr[l].maxn=tr[r].maxn=tr[l].minn=tr[r].minn=tr[k].set;
- tr[l].sum=tr[l].siz*tr[k].set;
- tr[r].sum=tr[r].siz*tr[k].set;
- tr[k].v=tr[k].set=;
- }
- void down_add(int k)
- {
- int l=k<<,r=k<<|;
- tr[l].maxn+=tr[k].add;
- tr[r].maxn+=tr[k].add;
- tr[l].minn+=tr[k].add;
- tr[r].minn+=tr[k].add;
- tr[l].sum+=tr[l].siz*tr[k].add;
- tr[r].sum+=tr[r].siz*tr[k].add;
- tr[l].add+=tr[k].add;
- tr[r].add+=tr[k].add;
- tr[k].add=;
- }
- void addd(int k)
- {
- if(tr[k].l>=x&&tr[k].r<=y)
- {
- tr[k].add+=z;
- tr[k].maxn+=z;
- tr[k].minn+=z;
- tr[k].sum+=z*tr[k].siz;
- return;
- }
- if(tr[k].v) down_set(k);
- if(tr[k].add) down_add(k);
- int mid=tr[k].l+tr[k].r>>;
- if(x<=mid) addd(k<<);
- if(y>mid) addd(k<<|);
- up(k);
- }
- void sett(int k)
- {
- if(tr[k].l>=x&&tr[k].r<=y)
- {
- tr[k].maxn=tr[k].minn=z;
- tr[k].set=z; tr[k].v=true;
- tr[k].sum=z*tr[k].siz;
- tr[k].add=;
- return;
- }
- if(tr[k].v) down_set(k);
- if(tr[k].add) down_add(k);
- int mid=tr[k].l+tr[k].r>>;
- if(x<=mid) sett(k<<);
- if(y>mid) sett(k<<|);
- up(k);
- }
- void query(int k,int w)
- {
- if(tr[k].l>=x&&tr[k].r<=y)
- {
- if(w==) ans+=tr[k].sum;
- else if(w==) ans=max(ans,tr[k].maxn);
- else ans=min(ans,tr[k].minn);
- return;
- }
- if(tr[k].v) down_set(k);
- if(tr[k].add) down_add(k);
- int mid=tr[k].l+tr[k].r>>;
- if(x<=mid) query(k<<,w);
- if(y>mid) query(k<<|,w);
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- build(,,n);
- char ch[];
- while(m--)
- {
- scanf("%s",ch);
- if(ch[]=='a')
- {
- scanf("%d%d%lld",&x,&y,&z);
- addd();
- }
- else if(ch[]=='e')
- {
- scanf("%d%d%lld",&x,&y,&z);
- sett();
- }
- else if(ch[]=='u')
- {
- scanf("%d%d",&x,&y);
- ans=;
- query(,);
- printf("%lld\n",ans);
- }
- else if(ch[]=='a')
- {
- scanf("%d%d",&x,&y);
- ans=-;
- query(,);
- printf("%lld\n",ans);
- }
- else
- {
- scanf("%d%d",&x,&y);
- ans=1e17;
- query(,);
- printf("%lld\n",ans);
- }
- }
- }
Codeves 4279 线段树练习5的更多相关文章
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- 总结:mysql的各种增删改查!
(原创总结)分为数据库的增删改查,数据表(和字段)的增删改查,数据的增删改查 三部分!// 创建用户并授权 GRANT SELECT ON bodydb.user TO us@localhost ID ...
- PHP编程20大效率要点
1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row[’id’] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用ech ...
- 最省钱的爬虫解决方案,比IP代理更划算
现状: 1.网上提供代理IP池的解决方案非常多,价格也有高有低,包天/月/年的都有,品质都要靠自己去尝试. 2.试过之后,发现成本相对高,每月要花200~300元, 所以希望研究一下是否有更性价比高的 ...
- SQLServer2008R2(百度网盘)下载与安装教程
很久没有安装过这个了,今天安装有点生疏了,这里记录一下分享 分为三块块1.下载地址,2.安装图解 ,3.安装失败问题 1.sqlserver 2008 r2 百度下载地址链接:下载 cn_sql_s ...
- Component 和 PureComponent 的区别;复制demo,肉眼可以的区别
React.PureComponent它用当前与之前 props 和 state 的浅比较覆写了 shouldComponentUpdate() 的实现.简单来说,就是PureComponent简单实 ...
- 新闻实时分析系统Hive与HBase集成进行数据分析
(一)Hive 概述 (二)Hive在Hadoop生态圈中的位置 (三)Hive 架构设计 (四)Hive 的优点及应用场景 (五)Hive 的下载和安装部署 1.Hive 下载 Apache版本的H ...
- python+selenium +unittest生成HTML测试报告
python+selenium+HTMLTestRunner+unittest生成HTML测试报告 首先要准备HTMLTestRunner文件,官网的HTMLTestRunner是python2语法写 ...
- Rust入坑指南:鳞次栉比
很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...
- 科学使用Log4View2
目录 目录 前言 科学使用 编辑和调试程序集 调试程序集 编辑程序集 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 这个标题很低调 ...
- Linux(CentOS7)修改默认yum源为国内的阿里云、网易yum源
修改方式: echo 备份当前的yum源 mv /etc/yum.repos.d /etc/yum.repos.d.backup4comex echo 新建空的yum源设置目录 mkdir /etc/ ...