HDU5306:Gorgeous Sequence——题解
http://acm.hdu.edu.cn/showproblem.php?pid=5306
给一个数组,m次操作:
1:l r x,将a[i](l<=i<=r)=min(a[i],x)
2:l r,求区间最大值。
3:l r,求区间和。
吉司机线段树,论文题,论文讲的很详细了。
维护一个最大值mx和次大值se,分类讨论:
当mx<=x显然没有影响。
当se<x<mx打标记修改区间。
否则暴力递归两个儿子。
通过奇(看)技(论)淫(文)巧能够证明复杂度是O(mlogn)。
(但是我跑得贼慢……)
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
ll sum[N*];
int n,m,b[N],mx[N*],se[N*],lz[N*],cnt[N*];
inline void upt(int a){
int ls=a<<,rs=a<<|;
if(mx[ls]==mx[rs]){
mx[a]=mx[ls];se[a]=max(se[ls],se[rs]);
cnt[a]=cnt[ls]+cnt[rs];
}
else if(mx[ls]<mx[rs]){
mx[a]=mx[rs];se[a]=max(mx[ls],se[rs]);
cnt[a]=cnt[rs];
}else{
mx[a]=mx[ls];se[a]=max(mx[rs],se[ls]);
cnt[a]=cnt[ls];
}
sum[a]=sum[ls]+sum[rs];
}
void build(int a,int l,int r){
lz[a]=-;
if(l==r){
sum[a]=mx[a]=b[l];
se[a]=-;cnt[a]=;
return;
}
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
upt(a);
}
inline void push(int a){
if(lz[a]==-)return;
int ls=a<<,rs=a<<|;
if(mx[ls]>lz[a]){
sum[ls]-=(ll)cnt[ls]*(mx[ls]-lz[a]);
mx[ls]=lz[a];
lz[ls]=lz[a];
}
if(mx[rs]>lz[a]){
sum[rs]-=(ll)cnt[rs]*(mx[rs]-lz[a]);
mx[rs]=lz[a];
lz[rs]=lz[a];
}
lz[a]=-;
}
void mdy(int a,int l,int r,int l1,int r1,int x){
if(r<l1||r1<l||mx[a]<=x)return;
if(l1<=l&&r<=r1&&se[a]<x){
sum[a]-=(ll)cnt[a]*(mx[a]-x);
mx[a]=x;lz[a]=x;
return;
}
int mid=(l+r)>>;
push(a);
mdy(a<<,l,mid,l1,r1,x);mdy(a<<|,mid+,r,l1,r1,x);
upt(a);
}
ll qry_sum(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return sum[a];
int mid=(l+r)>>;
push(a);
return qry_sum(a<<,l,mid,l1,r1)+qry_sum(a<<|,mid+,r,l1,r1);
}
int qry_mx(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return mx[a];
int mid=(l+r)>>;
push(a);
return max(qry_mx(a<<,l,mid,l1,r1),qry_mx(a<<|,mid+,r,l1,r1));
}
int main(){
int t=read();
while(t--){
n=read(),m=read();
for(int i=;i<=n;i++)b[i]=read();
build(,,n);
while(m--){
int op=read(),x=read(),y=read();
if(op==)mdy(,,n,x,y,read());
if(op==)printf("%d\n",qry_mx(,,n,x,y));
if(op==)printf("%lld\n",qry_sum(,,n,x,y));
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
HDU5306:Gorgeous Sequence——题解的更多相关文章
- hdu5306 Gorgeous Sequence
		hdu5306 Gorgeous Sequence 题目大意  给你一个序列,维护区间和,区间chkmin和区间最大值 数据范围 数据组数T,序列长度n,操作次数m $T = 100,\sum n ... 
- AHOI2014 奇怪的计算器 和 HDU5306 Gorgeous Sequence
		线段树秀操作题. 奇怪的计算器 有 N 个数,一共会对这 N 个数执行 M 个指令(对没个数执行的指令都一样),每一条指令可以是以下四种指令之一:(这里 a 表示一个正整数) 加上 a 减去 a 乘以 ... 
- [HDU5306]Gorgeous Sequence(标记回收线段树)
		题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ... 
- Gorgeous Sequence 题解 (小清新线段树)
		这道题被学长称为“科幻题” 题面 事实上,并不是做法科幻,而是“为什么能这么做?”的解释非常科幻 换句话说,复杂度分析灰常诡异以至于吉如一大佬当场吃书 线段树维护的量:区间和sum,区间最大值max1 ... 
- Gorgeous Sequence(线段树)
		Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ... 
- 【CF486E】LIS of Sequence题解
		[CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ... 
- HDU 5306 Gorgeous Sequence[线段树区间最值操作]
		Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ... 
- 2015 Multi-University Training Contest 2 hdu 5306 Gorgeous Sequence
		Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ... 
- HDOJ 5306 Gorgeous Sequence 线段树
		http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/ Gorgeous Sequence Time Limit: 6 ... 
随机推荐
- 关于BLOB/TEXT字段存储设计及性能的简单研究
			简单研究了一下BLOB/TEXT字段对数据库性能的影响,得到一个大概的结论:(未验证) 无论MySQL还是MSSQL,都可以通过把BLOB/TEXT数据存储在行外的方式提高性能 把BLOB/TEXT字 ... 
- CentOS 7.2安装11g Grid Infrastructure
			Preface Oracle claimed that 11g RAC is supported on Redhat Linux 7 and above version,but the ... 
- 180602-nginx多域名配置
			文章链接:https://liuyueyi.github.io/hexblog/2018/06/02/180602-nginx多域名配置/ nginx多域名配置 原来的域名过期了,重新买了一个hhui ... 
- python 终极篇 ---- 中间件
			中间件------------------------>>>>>>>>>>>>> 中间件是一个用来处理django的响应与 ... 
- lintcode491 回文数
			回文数 判断一个正整数是不是回文数. 回文数的定义是,将这个数反转之后,得到的数仍然是同一个数. 注意事项 给的数一定保证是32位正整数,但是反转之后的数就未必了. 您在真实的面试中是否遇到过这个题? ... 
- phantomjs抛出IOException
			使用phantomjs对网页进行截图遇到的问题 问题描述: 使用的phantomjs版本:phantomjs-2.1.1-windows 使用的截图js文件,\phantomjs-2.1.1-wind ... 
- UVa 401 - Palindromes 解题报告 - C语言
			1.题目大意 输入字符串,判断其是否为回文串或镜像串.其中,输入的字符串中不含0,且全为合法字符.以下为所有的合法字符及其镜像: 2.思路 (1)考虑使用常量数组而不是if或switch来实现对镜像的 ... 
- 零基础自学人工智能,看这些资料就够了(300G资料免费送)
			为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ... 
- STM32F4编程手册学习2_内存模型
			STM32F4编程手册学习2_内存模型 1. 内存映射 MCU将资源映射到一段固定的4GB可寻址内存上,如下图所示. 内存映射将内存分为几块区域,每一块区域都有一个定义的内存类型,一些区域还有一些附加 ... 
- ssh连接失败, 记下来原因和解决方案
			mac下使用secureCRT发现连接不了虚拟机上的linux 运行 ps -e | grep ssh,查看是否有sshd进程 如果没有,说明server没启动,通过 /etc/init.d/sshd ... 
