HDU 5306 Gorgeous Sequence[线段树区间最值操作]
Gorgeous Sequence
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2150 Accepted Submission(s): 594
0 x y t: For every x≤i≤y, we use min(ai,t) to replace the original ai's value.
1 x y: Print the maximum value of ai that x≤i≤y.
2 x y: Print the sum of ai that x≤i≤y.
The first line contains two integers n and m denoting the length of the sequence and the number of operations.
The second line contains n separated integers a1,…,an (∀1≤i≤n,0≤ai<231).
Each of the following m lines represents one operation (1≤x≤y≤n,0≤t<231).
It is guaranteed that T=100, ∑n≤1000000, ∑m≤1000000.
5 5
1 2 3 4 5
1 1 5
2 1 5
0 3 5 3
1 1 5
2 1 5
15
3
12
Please use efficient IO method

一份代码交了13遍。从TLE->WA->TLE->……QAQ
#include<cstdio>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
#define EF if(ch==EOF) return x;
using namespace std;
typedef long long ll;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;EF;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int N=1e6+;
const int M=N<<;
int n,m,a[N];
ll sum[M];int mx[M],se[M],mc[M];
inline void updata(int k){
sum[k]=sum[lc]+sum[rc];
mx[k]=max(mx[lc],mx[rc]);
se[k]=max(se[lc],se[rc]);mc[k]=;
if(mx[lc]!=mx[rc]) se[k]=max(se[k],min(mx[lc],mx[rc]));
if(mx[k]==mx[lc]) mc[k]+=mc[lc];
if(mx[k]==mx[rc]) mc[k]+=mc[rc];
}
inline void dec_tag(int k,int v){
if(v>=mx[k]) return ;
sum[k]+=1LL*(v-mx[k])*mc[k];mx[k]=v;
}
inline void pushdown(int k){
dec_tag(lc,mx[k]);
dec_tag(rc,mx[k]);
}
void build(int k,int l,int r){
if(l==r){
sum[k]=mx[k]=a[l];mc[k]=;se[k]=-;
return ;
}
int mid=l+r>>;
build(lc,l,mid);
build(rc,mid+,r);
updata(k);
}
void change(int k,int l,int r,int x,int y,int v){
if(v>=mx[k]) return ;
if(l==x&&r==y&&v>se[k]){
dec_tag(k,v);return ;
}
pushdown(k);
int mid=l+r>>;
if(y<=mid) change(lc,l,mid,x,y,v);
else if(x>mid) change(rc,mid+,r,x,y,v);
else change(lc,l,mid,x,mid,v),change(rc,mid+,r,mid+,y,v);
updata(k);
}
int query_max(int k,int l,int r,int x,int y){
if(l==x&&r==y) return mx[k];
pushdown(k);
int mid=l+r>>;
if(y<=mid) return query_max(lc,l,mid,x,y);
else if(x>mid) return query_max(rc,mid+,r,x,y);
else return max(query_max(lc,l,mid,x,mid),query_max(rc,mid+,r,mid+,y));
}
ll query_sum(int k,int l,int r,int x,int y){
if(l==x&&r==y) return sum[k];
pushdown(k);
int mid=l+r>>;
if(y<=mid) return query_sum(lc,l,mid,x,y);
else if(x>mid) return query_sum(rc,mid+,r,x,y);
else return query_sum(lc,l,mid,x,mid)+query_sum(rc,mid+,r,mid+,y);
}
inline void work(){
n=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
build(,,n);
for(int i=,opt,x,y,z;i<=m;i++){
opt=read();x=read();y=read();
if(opt==) z=read(),change(,,n,x,y,z);
if(opt==) printf("%d\n",query_max(,,n,x,y));
if(opt==) printf("%lld\n",query_sum(,,n,x,y));
}
}
int main(){
for(int T=read();T--;) work();
return ;
}
HDU 5306 Gorgeous Sequence[线段树区间最值操作]的更多相关文章
- 【hdu5306】Gorgeous Sequence 线段树区间最值操作
题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y ...
- 【bzoj4355】Play with sequence 线段树区间最值操作
题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...
- HDU - 5306 Gorgeous Sequence 线段树 + 均摊分析
Code: #include<algorithm> #include<cstdio> #include<cstring> #define ll long long ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...
- HDOJ 5306 Gorgeous Sequence 线段树
http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/ Gorgeous Sequence Time Limit: 6 ...
- HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)
HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸
D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举
HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
随机推荐
- ICSharpCode.SharpZipLib工具压缩与解压缩zip文件
using System; using System.Collections.Generic; using System.IO; using System.Text; using ICSharpCod ...
- Redis(十六):集群搭建(手动和自动)
一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):slave->master ...
- Linux 硬链接和软链接
硬链接:ln 源文件 新建名 指向同一个文件,并独立存在.当源文件删除不会影响硬链接文件的读取.不能跨文件系统和目录建连接. 例:新建一个文件吧!名字test 硬链接为t1. 查看文件,发现2个文件最 ...
- 每日英语:How to find the career of your dreams
The fate described by Dostoyevsky is a nightmare we all hope to escape. But we're surrounded by nays ...
- Linux SSH登录服务器报ECDSA host key "ip地址" for has changed and you have requested strict checking.错误
Linux SSH命令用了那么久,第一次遇到这样的错误:ECDSA host key "ip地址" for has changed and you have requested ...
- Windows Phone Unit Test 环境搭建
单元测试对工程质量带来的作用就不详细说明了,本文只讨论如何在WP开发环境下搭建测试工程 历史 从WP7时代官方是不支持UnitTest工程的,因此需要采用WPToolkitTest这个工程来实 ...
- [driver]/lib/modules
两个路径: /lib/modules/4.1.6/updates/net/wireless/cfg80211.ko /lib/modules/4.1.6/modules.dep
- linux进程同步机制_转
转自:Linux进程同步机制 具体应用可参考:线程同步 IPC之信号量 为了能够有效的控制多个进程之间的沟通过程,保证沟通过程的有序和和谐,OS必须提供一 定的同步机制保证进程之间不会自说 ...
- Java中的阻塞队列(BlockingQueue)
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- Desugar Scala(16) -- Lower Bound
欢迎关注我的新博客地址:http://cuipengfei.me/ Lower bound,不知道这个词的确切中文翻译是怎样的.我们直接看例子吧. 1 2 3 class Pair[T](val fi ...