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 ]内最长连续黑色石头的 ...
随机推荐
- PostgreSQL远端访问
PostgreSQL默认的理念是运行在本地地址且不允许外部访问的. 如果想通过Navicat for postgreSql这种优秀的第三方软件访问需要做出如下修改: 一.启动在外部可访问的地址上 编辑 ...
- linux 使用FIO测试磁盘iops 方法详解
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎, 包括:sync,mmap, libaio, posixaio, SG v3, splice, null, ...
- Hp && Dell服务器硬件监控
HP 安装HP工具: yum install hpssacli 1 查看控制器状态 raid卡型号等hpssacli ctrl all show status 2 查看硬盘类型.大小 raid级别.状 ...
- Linux之系统管理员笔记
1.查看最近一次启动时间 who -b system boot -- : 2.who命令实现带有“表头”的查询结果 who -H NAME LINE TIME COMMENT root pts/ -- ...
- ubuntu和pypi换源
ubuntu用apt-get下载的源是可以更换的.之前一直是打开软件中心在编辑里找源,找到后系统会自动备份原来的源并换源.奇怪却搜不到自己学校的源=.= 想换源还有一个原因,之前在update的时候会 ...
- lucene4.7学习总结 (zhuan)
http://blog.csdn.NET/mdcmy/article/details/38167955?utm_source=tuicool&utm_medium=referral ***** ...
- jdom 读取
读取XML文档 读取文档,首先需要一个xml的解析器,它可以自动的解析出各个元素,并且把子元素作为自己的孩子节点,方便操作. 主要使用的函数: SAXBuilder.build("xxx.x ...
- 基于html5和jquery的篮球跳动游戏
今天给大家分享一款基于html5和jquery的篮球跳动游戏.这款实例和之前分享的HTML5重力感应小球冲撞动画类似.用鼠标拖动篮球,篮球在页面上跳动,可在演示中看下效果.效果图如下: 在线预览 ...
- rt serial 的编写
/* * Copyright (C) 2005-2007 Jan Kiszka <jan.kiszka@web.de>. * * Xenomai is free software; you ...
- RabbitMQ之HelloWorld【译】
简介 RabbitMQ是一个消息代理,主要的想法很简单:它接收并转发消息.你可以把它当做一个邮局,当你发送邮件到邮筒,你相信邮差先生最终会将邮件投递给收件人.RabbitMQ在这个比喻里,是一个邮筒, ...