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 ...
随机推荐
- Phone Code
Polycarpus has n friends in Tarasov city. Polycarpus knows phone numbers of all his friends: they ar ...
- windows7设置定时任务运行ThinkPHP框架程序
1. 设置Windows的任务计划 可以参考win7计划任务的设置方法 2. 新建Windows执行文件bat 新建cron.bat文件,内容如下: D: cd \wamp\www\tp32 D:\w ...
- PHP 在 Laravel 中动态隐藏 API 字段
我最近在 Laravel Brasil 社区看到一个问题,结果比看起来更有趣.想象一下你有一个 UsersResource 用下面的实现: <?php namespace App\Http\Re ...
- java编程思想第四版第八章总结
1. 多态的含义 面向对象的三大基本特征: 封装,继承,多态. 多态是干什么的? 多态将做什么和怎么做分离开.从另一个角度将接口是实现类分离开. 多态的作用 消除类型之间耦合的关系 使用多态的好处? ...
- javascript 使用 setInterval 实现倒计时
javascript 使用 setInterval 实现倒计时 var timer = setInterval(function () { console.log(valid_time); if (v ...
- 领扣(LeetCode)两数之和II - 输入有序数组 个人题解
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- bat脚本知识总结
1常用基本命令 1.1 @ 它的作用是让执行窗口中不显示它后面这一行的命令本身 1.2 echo 它其实是一个开关命令,就是说它只有两种状态:打开和关闭.于是就有了echo on 和echo off两 ...
- 解决FirewallD is not running问题
centos7 1.查看firewalld状态:systemctl status firewalld,如果是dead状态,即防火墙未开启. 2.开启防火墙systemctl start firewal ...
- 带你涨姿势的认识一下 Kafka 消费者
之前我们介绍过了 Kafka 整体架构,Kafka 生产者,Kafka 生产的消息最终流向哪里呢?当然是需要消费了,要不只产生一系列数据没有任何作用啊,如果把 Kafka 比作餐厅的话,那么生产者就是 ...
- 【Linux系列】Centos 7安装 Mysql8.0(五)
目的 本文主要介绍以下两点: 一. 如何安装Mysql8.0 二. Navicat连接Mysql 一. 如何安装Mysql8.0 安装Mysql有两种方式: 直接下载官方的源(比较慢) https:/ ...