HDU - 5306 Gorgeous Sequence 线段树 + 均摊分析
Code:
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 2000000
#define lson (now<<1)
#define rson ((now<<1)|1)
using namespace std;
int n,q;
ll arr[maxn],mx[maxn<<2],se[maxn<<2],cnt[maxn<<2],sum[maxn<<2];
void pushup(int l,int r,int now) {
int mid=(l+r)>>1;
int ls=lson,rs=(r>mid)?rson:0;
sum[now]=sum[ls]+sum[rs];
if(mx[ls]>mx[rs]) mx[now]=mx[ls],cnt[now]=cnt[ls],se[now]=max(se[ls],mx[rs]);
if(mx[rs]>mx[ls]) mx[now]=mx[rs],cnt[now]=cnt[rs],se[now]=max(se[rs],mx[ls]);
if(mx[ls]==mx[rs]) mx[now]=mx[ls],cnt[now]=cnt[ls]+cnt[rs],se[now]=max(se[ls],se[rs]);
}
void mark(int now,ll v) {
if(v<mx[now]) sum[now]-=(mx[now]-v)*cnt[now], mx[now]=v;
}
void pushdown(int l,int r,int now) {
int mid=(l+r)>>1;
mark(lson,mx[now]);
if(r>mid) mark(rson,mx[now]);
}
void build(int l,int r,int now) {
if(l==r) {
mx[now]=arr[l],se[now]=-1,sum[now]=arr[l],cnt[now]=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson);
if(r>mid) build(mid+1,r,rson);
pushup(l,r,now);
}
void change(int l,int r,int now,int L,int R,ll v) {
if(mx[now]<=v) return;
if(l>=L&&r<=R&&se[now]<v) {
mark(now,v);
return;
}
pushdown(l,r,now);
int mid=(l+r)>>1;
if(L<=mid) change(l,mid,lson,L,R,v);
if(R>mid) change(mid+1,r,rson,L,R,v);
pushup(l,r,now);
}
ll qmax(int l,int r,int now,int L,int R) {
if(l>=L&&r<=R) return mx[now];
pushdown(l,r,now);
int mid=(l+r)>>1;
ll re=-1;
if(L<=mid) re=max(re,qmax(l,mid,lson,L,R));
if(R>mid) re=max(re,qmax(mid+1,r,rson,L,R));
return re;
}
ll qsum(int l,int r,int now,int L,int R) {
if(l>=L&&r<=R) return sum[now];
pushdown(l,r,now);
int mid=(l+r)>>1;
ll re=0;
if(L<=mid) re+=qsum(l,mid,lson,L,R);
if(R>mid) re+=qsum(mid+1,r,rson,L,R);
return re;
}
void solve() {
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i) scanf("%lld",&arr[i]);
build(1,n,1);
while(q--) {
int opt,x,y;
ll t;
scanf("%d%d%d",&opt,&x,&y);
if(opt==0) scanf("%lld",&t),change(1,n,1,x,y,t);
if(opt==1) printf("%lld\n",qmax(1,n,1,x,y));
if(opt==2) printf("%lld\n",qsum(1,n,1,x,y));
}
}
int main() {
// setIO("input");
int T;
scanf("%d",&T);
mx[0]=se[0]=-1;
while(T--) solve();
return 0;
}
HDU - 5306 Gorgeous Sequence 线段树 + 均摊分析的更多相关文章
- HDU 5306 Gorgeous Sequence[线段树区间最值操作]
Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...
- 【uoj#228】基础数据结构练习题 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有三种:区间加.区间开根.区间求和. $n,m,a_i\le 100000$ . 题解 线段树+均摊分析 对于原来的两个数 $a$ ...
- cf250D. The Child and Sequence(线段树 均摊复杂度)
题意 题目链接 单点修改,区间mod,区间和 Sol 如果x > mod ,那么 x % mod < x / 2 证明: 即得易见平凡, 仿照上例显然, 留作习题答案略, 读者自证不难. ...
- HDOJ 5306 Gorgeous Sequence 线段树
http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/ Gorgeous Sequence Time Limit: 6 ...
- bzoj4127 Abs 树链剖分+线段树+均摊分析
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4127 题解 首先区间绝对值和可以转化为 \(2\) 倍的区间正数和 \(-\) 区间和.于是问 ...
- UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题
题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...
- HDU - 5306 Gorgeous Sequence (吉司机线段树)
题目链接 吉司机线段树裸题... #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3 ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
随机推荐
- c++中byte数组与字符串的转化
我们不讨论与字符集有关的内容,只讨论在字节流传递过程中的问题. 我们在做一系统操作时会需要使用到数据流,比如接收网络数据,文件数据,图片数据,原始数据大多是以byte数组的形式提供,与其它语言(c#, ...
- expect实战
1.测试主机是否在线 #!/bin/bash#创建一个IP地址文件.>ip.txt (清空文本)#使用for循环ping测试主机是否在线.for i in {2..254}do ...
- JS图片宽度自适应移动端
$(function(){ $("#d-intro").find("img").each(function () { $(this ...
- xmake v2.2.9 发布, 新增c++20 modules的实验性支持
这个版本没啥太大新特性,主要对c++20 modules进行了实验性支持,目前支持clang/msvc编译器,除此之外改进了不少使用体验,并且提高了一些稳定性. 另外,这个版本新增了socket.io ...
- maven 异常 提示 cannot be read or is not a valid ZIP file
Archive for required library: 'D:/repository/Maven/org/springframework/spring-aop/4.3.6.RELEASE/spri ...
- [Git] 025 标签命令
0. 前言 小时候看<剑花-烟雨-江南>,惊讶于那个多重身份的"小侯爷" 后来发现,现实中拥有比小侯爷更多身份的人多如牛毛 其实,在 "Git" 中 ...
- shell学习笔记2---执行Shell脚本(多种方法)
在新进程中运行 Shell 脚本 1) 将 Shell 脚本作为程序运行 切换到脚本所在位置(还要给脚本加上可执行权限) [mozhiyan@localhost demo]$ ./test.sh #执 ...
- 06: django+celery+redis
目录: 1.1 Celery介绍 1.2 celery 组件 1.3 安装相关包 与 管理命令 1.4 celery与Django执行异步任务 1.5 在django中使用计划任务功能 1.1 Cel ...
- 网络 osi七层协议
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
- neo4j 初探
neo4j 初探 参考 转载:http://shomy.top/2018/06/08/neo4j-start/ 近期需要处理图数据,考察后打算使用neo4j, 相比其他一些图数据库,neo4j开源,跨 ...