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) ...
随机推荐
-
【zz】matlab 求差集
matlab判断2个数组中不同元素--setdiff c = setdiff(A, B) 返回在A中有,而B中没有的值,结果向量将以升序排序返回.在集合论中,c = A - B.A和B也可以是字符串细 ...
-
DQL、DML、DDL、DCL的概念与区别
SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...
-
curl获得http响应码 302 和绑定host
shell curl 取得HTTP返回的状态 获取状态码 curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com 获取时间 curl ...
-
Android 通过代码设置radiobutton不同方位图标的两种方法
更换radiobutton中的图片在xml中很好设置,但对于初学者如何在代码中设置还是不容易找的.没法子,通过看原版api找到两个方法,setCompoundDrawables和setCompound ...
-
译文:TransactionScope 与 Async/Await
你可能不知道这一点,在 .NET Framework 4.5.0 版本中包含有一个关于 System.Transactions.TransactionScope 在与 async/await 一起工 ...
-
自己动手写RTP服务器——传输所有格式的视频
上一篇文章我们介绍了如何用一个简单的UDP socket搭建一个RTP服务器.我把这份80行的代码呈现到客户面前的时候,就有人不满意了. 还有人在参考的时候会问:“楼主你的TS格式的文件是哪里来的?应 ...
-
确定当前Python环境中的site-packages目录位置
引入“搜索路径”这个概念是因为在使用import语句时,当解释器遇到import语句,如果模块在当前的搜索路径就会被导入. 搜索路径是一个解释器会先进行搜索的所有目录的列表. 那么python如何添加 ...
-
effective C++ Item 33 避免隐藏继承而来的名字
1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...
-
Linux - 微软无线鼠标滚动过快问题
Linux - 微软无线鼠标滚动过快问题 使用了一段时间的 Manjaro , 感觉相当不错, 但有一个蛋疼的地方就是每次滚动鼠标滚轮, 都会切换一页以上的页面, 总是有一部分看不到. 之前以为是 L ...
-
如何对 PHP 代码加密?
这几天有同事问如何对 PHP 代码进行加密? 在我印象中 PHP 加密还是比较麻烦的,之前只知道 Zend Guard . 刚刚找了一圈发现现在还是有很多可行的方案,先记录一下,以后使用. 使用混淆 ...