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——题解的更多相关文章

  1. hdu5306 Gorgeous Sequence

    hdu5306 Gorgeous Sequence 题目大意 ​ 给你一个序列,维护区间和,区间chkmin和区间最大值 数据范围 数据组数T,序列长度n,操作次数m $T = 100,\sum n ...

  2. AHOI2014 奇怪的计算器 和 HDU5306 Gorgeous Sequence

    线段树秀操作题. 奇怪的计算器 有 N 个数,一共会对这 N 个数执行 M 个指令(对没个数执行的指令都一样),每一条指令可以是以下四种指令之一:(这里 a 表示一个正整数) 加上 a 减去 a 乘以 ...

  3. [HDU5306]Gorgeous Sequence(标记回收线段树)

    题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ...

  4. Gorgeous Sequence 题解 (小清新线段树)

    这道题被学长称为“科幻题” 题面 事实上,并不是做法科幻,而是“为什么能这么做?”的解释非常科幻 换句话说,复杂度分析灰常诡异以至于吉如一大佬当场吃书 线段树维护的量:区间和sum,区间最大值max1 ...

  5. Gorgeous Sequence(线段树)

    Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  6. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  7. HDU 5306 Gorgeous Sequence[线段树区间最值操作]

    Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  8. 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 ...

  9. HDOJ 5306 Gorgeous Sequence 线段树

    http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/ Gorgeous Sequence Time Limit: 6 ...

随机推荐

  1. 第五模块·WEB开发基础-第2章JavaScript基础

    第1章 JavaScript基础 01-JavaScript历史介绍 02-JavaScript的组成 03-JavaScript的引入方式 04-变量的使用 05-基本数据类型(一) 06-基本数据 ...

  2. .NET中发送邮件的实现

    .NET中发送邮件 注意: 1.引用下列命名空间: using System.Net; using System.Net.Mail; 2.确保你使用的发送邮件的邮箱开启了stamp服务等. /// & ...

  3. 前端开发工程师 - 02.JavaScript程序设计 - 期末考试

    期末考试客观题 期末考试主观题 https://www.15yan.com/story/aY0HWAQ7oNU/     1(8分) 函数myType用于根据输入参数返回相应的类型信息. 语法如下: ...

  4. 开源自动驾驶仿真平台 AirSim (2) - 编译 AirSim

    AirSim 的官方 Github: https://github.com/Microsoft/AirSim 对于 Unreal Engine 来说,AirSim 其实是作为一个插件存在,说白了就是把 ...

  5. LeetCode 141——环形链表

    1. 题目 2. 解答 2.1 方法 1 定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇. /** * Definition for singly-link ...

  6. HDU 1007 Quoit Design(计算几何の最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  7. 第三课——MFC编程

    一.MFC概述 1. MFC简述 MFC不仅仅是一套基础类库,更是一种编程方式. 2. MFC由来 1987年微软公司推出了第一代Windows产品,并为应用程序设计者提供了Win16(16位Wind ...

  8. 视频播放截图及简要文字介绍——Thunder团队

    视频播放截图及简要文字介绍 图一:团队Logo ——从此我们有了自己的标志 图二:扫描本地书籍 ——可阅读本地的喜爱书籍 图三:在本地添加自己喜爱的图书 ——将自己喜爱的书籍加入书架,方便阅读 图四: ...

  9. c#,mysql,读取乱码问题

    1.首先保证数据库的表是UTF8类型:数据库是否是utf8无关紧要: 2.c#连接数据库语句添加“charset=utf8”一句:.exe.config是否添加这一句也无关紧要: 3.访问数据库数据用 ...

  10. 总结python 元组和列表的区别

    python的基本类型中有元组和列表这么俩个,但是这哥俩却比较难于区分,今天就来用简单的实例说明两者的不同. 列表:1.使用中括号([ ])包裹,元素值和个数可变 实例: aaa = ['sitena ...