2018.07.25 hdu5306Gorgeous Sequence(线段树)
传送门
线段树基本操作。
要求维护区间取min" role="presentation" style="position: relative;">minmin(给定一个数x" role="presentation" style="position: relative;">xx,让整个区间中的数都变成min(x,a[i])" role="presentation" style="position: relative;">min(x,a[i])min(x,a[i]))
然后是查询区间最大与区间和。
第一眼看到以为是max" role="presentation" style="position: relative;">maxmax和min" role="presentation" style="position: relative;">minmin直接剪枝,结果写了一发发现挂了,然后找到了一篇叫做segment" role="presentation" style="position: relative;">segmentsegment tree" role="presentation" style="position: relative;">treetree beats" role="presentation" style="position: relative;">beatsbeats的论文,%%%%%%%%%%%jiry2" role="presentation" style="position: relative;">jiry2jiry2,然后就学会了这种操作。
其实也就是维护区间最大和区间次大然后分类讨论。
如果当前的x" role="presentation" style="position: relative;">xx已经不小于区间最大值了直接返回,因为无法更新区间中任意一个节点。
如果当前的x" role="presentation" style="position: relative;">xx比区间次大值要大的话,说明只有区间最大值会被更新。这样我们还要维护一个区间中最大值的出现次数,方便更新。
如果x" role="presentation" style="position: relative;">xx比区间次大值还要小?递归更新吧。
论文中着重讲述了复杂度的证明。
代码如下:
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline void write(ll x){
if(x>9)write(x/10);
putchar((x%10)^48);
}
int T_T,n,m;
struct Node{int l,r;ll cx,sum,mx,mxx;}T[N<<2];
inline ll max(ll a,ll b){return a>b?a:b;}
inline void pushup(int p){
T[p].sum=T[lc].sum+T[rc].sum;
T[p].mx=max(T[lc].mx,T[rc].mx);
T[p].cx=(T[p].mx==T[lc].mx?T[lc].cx:0)+(T[p].mx==T[rc].mx?T[rc].cx:0);
T[p].mxx=max(T[lc].mx==T[p].mx?T[lc].mxx:T[lc].mx,T[rc].mx==T[p].mx?T[rc].mxx:T[rc].mx);
}
inline void pushnow(int p,ll v){if(T[p].mx<=v)return;T[p].sum+=T[p].cx*(v-T[p].mx),T[p].mx=v;}
inline void pushdown(int p){pushnow(lc,T[p].mx),pushnow(rc,T[p].mx);}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(l==r){T[p].cx=1,T[p].mxx=-1,T[p].mx=T[p].sum=read();return;}
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr,ll v){
if(ql>T[p].r||qr<T[p].l||T[p].mx<=v)return;
if(ql<=T[p].l&&T[p].r<=qr&&T[p].mxx<v){pushnow(p,v);return;}
pushdown(p);
if(qr<=mid)update(lc,ql,qr,v);
else if(ql>mid)update(rc,ql,qr,v);
else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
pushup(p);
}
inline ll query_max(int p,int ql,int qr){
if(ql>T[p].r||qr<T[p].l)return 0;
if(ql<=T[p].l&&T[p].r<=qr)return T[p].mx;
pushdown(p);
if(qr<=mid)return query_max(lc,ql,qr);
if(ql>mid)return query_max(rc,ql,qr);
return max(query_max(lc,ql,mid),query_max(rc,mid+1,qr));
}
inline ll query_sum(int p,int ql,int qr){
if(ql>T[p].r||qr<T[p].l)return 0;
if(ql<=T[p].l&&T[p].r<=qr)return T[p].sum;
pushdown(p);
if(qr<=mid)return query_sum(lc,ql,qr);
if(ql>mid)return query_sum(rc,ql,qr);
return query_sum(lc,ql,mid)+query_sum(rc,mid+1,qr);
}
int main(){
T_T=read();
while(T_T--){
n=read(),m=read();
build(1,1,n);
while(m--){
int op=read(),l=read(),r=read();
switch(op){
case 0:{ll v=read();update(1,l,r,v);break;}
case 1:{write(query_max(1,l,r)),puts("");break;}
default:{write(query_sum(1,l,r)),puts("");break;}
}
}
}
return 0;
}
2018.07.25 hdu5306Gorgeous Sequence(线段树)的更多相关文章
- 2018.07.22 codeforces750E(线段树维护状态转移)
传送门 给出一个数字字串,给出若干个询问,询问在字串的一段区间保证出现2017" role="presentation" style="position: re ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)
传送门 线段树综合. 让我想起一道叫做siano" role="presentation" style="position: relative;"&g ...
- Wow! Such Sequence!(线段树4893)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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 ...
- hdu4893Wow! Such Sequence! (线段树)
Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- Codeforces 438D The Child and Sequence - 线段树
At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...
- hdu 5828 Rikka with Sequence 线段树
Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
随机推荐
- 集中化管理平台Saltstack安装配置
salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ,用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppet,Chef功能类似 ...
- Boost.Hana
Boost.Hana Boost.Hana 是一个元编程的库.它为不同种类数据的集合以及类型的集合提供了容器和算法. #include <boost/hana.hpp> namespace ...
- Hibernate的一个问题object references an unsaved transient instance - save the transi5
1 我做了一对多和多对一的双向关联关系,在User这一方@ManyToOne已经设置了级联Cascade,这样在测试程序中保存User时,Group也应该自动保存,为什么会抛出以下的异常: (我是按着 ...
- 吴裕雄 实战python编程(3)
import requests from bs4 import BeautifulSoup url = 'http://www.baidu.com'html = requests.get(url)sp ...
- 一行转多行 及多行转一行的 hive语句
注意 :|,: 是特殊符号,要用 "\\|", "\\;"来表示. 一行转多行 usertags 里面有很多项,每项之间以逗号分隔 create t ...
- .Spark Streaming(上)--实时流计算Spark Streaming原理介
Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...
- 首届阿里巴巴在线技术峰会,9位大V演讲整理!
https://yq.aliyun.com/articles/57826 感谢参加阿里巴巴在线技术峰会.7月19日的3场专家分享:Blink.Docker.电商互动:7月20日的云数据库十大经典案 例 ...
- Linux运维就业技术指导(九)期末架构考核
一,毕业架构设计考核筹备 1.1,架构图模板示例 1.1.1 架构图(一)概述 本架构是4层lvs负载均衡给后方7层nginx反向代理: 业务进行了动静分离: 数据库前端有memcached缓存组,降 ...
- linux下set命令的参数及用法
linux set 命令 功能说明:设置shell. 语 法:set [+-abCdefhHklmnpPtuvx] 补充说明:用set 命令可以设置各种shell选项或者列 出shell变量.单个选 ...
- Linux 软件 安装到 /usr,/usr/local/ 还是 /opt 目录
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...