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. unity中虚拟摇杆的实现

    实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach  boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...

  2. [CF19B]Checkout Assistant

    题目描述 Bob 来到一家现购自运商店,将 n 件商品放入了他的手推车,然后到收银台 付款.每件商品由它的价格 pi 和收银员扫描它的时间 ti 秒定义.当收银员正在扫 描某件商品时,Bob 可以从他 ...

  3. 【WXS数据类型】Function

    属性: 名称 值类型 说明 [Function].constructor [String] 返回值为“Function”,表示类型的结构字符串 [Function].length [Number] 返 ...

  4. 211. String Permutation【LintCode by java】

    Description Given two strings, write a method to decide if one is a permutation of the other. Exampl ...

  5. Map Reduce Application(Join)

    We are going to explain how join works in MR , we will focus on reduce side join and map side join. ...

  6. idea clion编译器

    RNMV64P0LA-eyJsaWNlbnNlSWQiOiJSTk1WNjRQMExBIiwibGljZW5zZWVOYW1lIjoiY24gdHUiLCJhc3NpZ25lZU5hbWUiOiIiL ...

  7. usdt信息小结

    https://blog.csdn.net/weixin_42208011/article/details/80499536 https://blog.csdn.net/weixin_42208011 ...

  8. HADOOP docker(三):HDFS高可用实验

      前言1.机器环境2.配置HA2.1 修改hdfs-site.xml2.2 设置core-site.xml3.配置手动HA3.1 关闭YARN.HDFS3.2 启动HDFS HA4.配置自动HA4. ...

  9. centos环境配置(nginx,node.js,mysql)

    1.安装 Install GCC and Development Tools on a CentOS yum group install "Development Tools" n ...

  10. scanf格式控制符的完整格式

    scanf格式控制的完整格式: %     *     m     l或h     格式字符 ①格式字符与printf函数中的使用方式相同,以%d.%o.%x.%c.%s.%f.%e,无%u格式.%g ...