hdu5306 Gorgeous Sequence
hdu5306 Gorgeous Sequence
题目大意
给你一个序列,维护区间和,区间chkmin和区间最大值
数据范围
数据组数T,序列长度n,操作次数m
$T = 100,\sum n \leqslant 1000000 ,\sum m \leqslant 1000000 $
这是一道吉司机线段树的裸题,直接维护区间最大值,次大值,最大值个数,区间和就行了。
#include<bits/stdc++.h>
using namespace std;
#define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
#define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
typedef long long ll;
inline int read(){
int x;
char c;
int f=1;
while((c=getchar())!='-' && (c<'0' || c>'9'));
if(c=='-') c=getchar(),f=-1;
x=c^'0';
while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
return x*f;
}
inline ll readll(){
ll x;
char c;
ll f=1;
while((c=getchar())!='-' && (c<'0' || c>'9'));
if(c=='-') c=getchar(),f=-1;
x=c^'0';
while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
return x*f;
}
inline bool chkmax(int &x,int y){return (y>x)?(x=y,1):0;}
inline bool chkmin(int &x,int y){return (y<x)?(x=y,1):0;}
const int maxn=1e6+10;
struct Segment_tree{
int Max[maxn<<2],Sec[maxn<<2],tot[maxn<<2],tag[maxn<<2];
ll sum[maxn<<2];
void push_up(int x){
sum[x]=sum[x<<1]+sum[x<<1|1];
Max[x]=Max[x<<1],tot[x]=tot[x<<1],Sec[x]=max(Sec[x<<1],Sec[x<<1|1]);
if(chkmax(Max[x],Max[x<<1|1])) tot[x]=tot[x<<1|1],chkmax(Sec[x],Max[x<<1]);
else if(Max[x]==Max[x<<1|1]) tot[x]+=tot[x<<1|1];
else chkmax(Sec[x],Max[x<<1|1]);
}
void change(int x,int v){
if(Max[x]<=v) return;
sum[x]-=1ll*(Max[x]-v)*tot[x];
Max[x]=tag[x]=v;
}
void push_down(int x){
if(tag[x]==-1) return;
change(x<<1,tag[x]);
change(x<<1|1,tag[x]);
tag[x]=-1;
}
void build_tree(int x,int L,int R){
tag[x]=-1;
if(L==R){
Max[x]=read();tot[x]=1;
Sec[x]=0;sum[x]=Max[x];
return;
}
int Mid=(L+R)>>1;
build_tree(x<<1,L,Mid);
build_tree(x<<1|1,Mid+1,R);
push_up(x);
}
void update(int x,int L,int R,int ql,int qr,int v){
if(Max[x]<=v) return;
if(ql<=L && R<=qr && Sec[x]<v){
change(x,v);
return;
}
int Mid=(L+R)>>1;
push_down(x);
if(ql<=Mid) update(x<<1,L,Mid,ql,qr,v);
if(qr>Mid) update(x<<1|1,Mid+1,R,ql,qr,v);
push_up(x);
}
int query_Max(int x,int L,int R,int ql,int qr){
if(ql<=L && R<=qr) return Max[x];
push_down(x);
int Mid=(L+R)>>1,res=0;
if(ql<=Mid) res=query_Max(x<<1,L,Mid,ql,qr);
if(qr>Mid) chkmax(res,query_Max(x<<1|1,Mid+1,R,ql,qr));
push_up(x);
return res;
}
ll query_sum(int x,int L,int R,int ql,int qr){
if(ql<=L && R<=qr) return sum[x];
push_down(x);
int Mid=(L+R)>>1;
ll res=0;
if(ql<=Mid) res=query_sum(x<<1,L,Mid,ql,qr);
if(qr>Mid) res+=query_sum(x<<1|1,Mid+1,R,ql,qr);
push_up(x);
return res;
}
}Seg;
int main(){
#ifndef ONLINE_JUDGE
freopen("segment.in","r",stdin);
freopen("segment.out","w",stdout);
#endif
int T=read();
while(T--){
int n=read(),m=read();
Seg.build_tree(1,1,n);
while(m--){
int ty=read(),l=read(),r=read();
if(ty==0){
int x=read();
Seg.update(1,1,n,l,r,x);
}
else if(ty==1) printf("%d\n",Seg.query_Max(1,1,n,l,r));
else printf("%lld\n",Seg.query_sum(1,1,n,l,r));
}
}
return 0;
}
hdu5306 Gorgeous Sequence的更多相关文章
- AHOI2014 奇怪的计算器 和 HDU5306 Gorgeous Sequence
线段树秀操作题. 奇怪的计算器 有 N 个数,一共会对这 N 个数执行 M 个指令(对没个数执行的指令都一样),每一条指令可以是以下四种指令之一:(这里 a 表示一个正整数) 加上 a 减去 a 乘以 ...
- [HDU5306]Gorgeous Sequence(标记回收线段树)
题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ...
- 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 ...
- Gorgeous Sequence(线段树)
Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- 【hdu5306】 Gorgeous Sequence
http://acm.hdu.edu.cn/showproblem.php?pid=5306 (题目链接) 题意 区间取$min$操作,区间求和操作,区间求最值操作. Solution 乱搞一通竟然A ...
- 【hdu5306】Gorgeous Sequence 线段树区间最值操作
题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y ...
- 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) ...
随机推荐
- Unexpected error from external database driver (1)
当尝试把Excel导入SQL时,发生此异常: Unexpected error from external database driver (1). 在网上查找到一个解决方法,网址http://dat ...
- Ionic 动态配置url路由的设置
随着Ionic App功能的不断增加,需要路由的url设置就越来越多,不喜欢在config函数中写一堆硬代码,一则不美,二则维护起来也麻烦,能不能把这些数据独立出来呢? 经过查找资料与各种实验,最终找 ...
- VM下设置CenOS为静态IP
在本机利用VM启动了4台虚拟机来搭建zookeeper集群,但是每次电脑重启后,虚拟机的IP都会变化,现在想来固定每台虚拟机的IP. 1.Step1:查看网关和子网掩码 记住选用NAT模式,点击NAT ...
- [Oracle]Master表字段扩张时的对应方法
Master表字段扩张时的对应方法 如果Master表的数据量很大,Master表中的列,宽度扩张了,MVIEW表如何对应处理? 此时,重建MVIEW可能会耗费很长的时间. 可以采用 alter ma ...
- GitFlow原理浅析
一.Git优点 分布式存储 , 本地仓库包含了远程仓库的所有内容 . 安全性高 , 远程仓库文件丢失了也不怕 优秀的分支模型 , 创建/合并分支非常的方便 方便快速 , 由于代码本地都有存储 , 所以 ...
- 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID
---恢复内容开始--- 转:https://www.jianshu.com/p/38f4d1a4763b [心路历程] 最近刚好在思考工作中统计数据所用的标识码产生的数据误差到底有多大,借此机会几番 ...
- 分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记
公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ...
- 变量 var &函数new
声明变量 变量:变量是存储信息的容器,创建变量通常称为"声明"变量 变量必须以字母开头(小驼峰式myName): 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做): 变量名 ...
- 【2015 软件工程 个人项目 PJ1】四则运算题目生成程序
1.开发时间预估 PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 2day Dev ...
- 基于SSH 供应链管理系统质量属性说明
产品的易用程度如何,执行速度如何,可靠性如何,当发生异常情况时,系统如何处理.这些被称为软件质量属性,而特性是指系统非功能(也叫非行为)部分的需求. 性能:性能就是一个东西有多快,通常指响应时间或延迟 ...