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) ...
随机推荐
- LiveCharts文档-3开始-6轴Axes
原文:LiveCharts文档-3开始-6轴Axes LiveCharts文档-3开始-6轴Axes 通常来说,你可以自定义LiveChart里的任何东西,Axes也不例外.下面这幅图展示了Axes. ...
- 大话设计模式之模板模式 C#
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...
- JS回调函数--简单易懂有实例
版权声明:本文为博主原创文章,转载请注明出处 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function t ...
- elaticsear no [query] registered for [filtered] 错误
1.问题描述 执行语句: GET /megacorp/employee/_search { "query" : { "filtered" : { "f ...
- [React]全自动数据表格组件——BodeGrid
表格是在后台管理系统中用的最频繁的组件之一,相关的功能有数据的新增和编辑.查询.排序.分页.自定义显示以及一些操作按钮.我们逐一深入进行探讨以及介绍我的设计思路: 新增和编辑 想想我们最开始写新增 ...
- 【JVM.2】垃圾收集器与内存分配策略
垃圾收集器需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 在前一节中介绍了java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈 ...
- ul ol li的序号编号样式
序号样式例子,下面是html代码(做参考) <ol> <li>列表内容列表内容列表内容列表</li> <li>列表内容列表内容列表内容列表</li ...
- pair project elevator
结对编程——电梯调度 12061181 高孟烨 12061182 郝倩 1.结对编程的优缺点: 优点:结对编程可以结合两个人各自擅长之地,充分发挥两个人各自的优势,两个人一起合作效率会更高.一份工作两 ...
- sixsix团队M2阶段Postmortem
设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要解决的问题:目前外卖网站比较多,用户很难快速找到合适的外卖,我们集合各个网站的外卖信息,为用户提 ...
- Bing词典分析
0x01 Bug测试结果 本次测试的是Bing词典wp版本V4.5.2,经过测试,共发现如下Bug. 1.更新后,旧版本首页的每日单词与文章推荐不能重新获得,部分搜索历史记录丢失. 2.在单词挑战模式 ...