【HDU5306】Gorgeous Sequence
这个题目是Segment-Tree-beats的论文的第一题。
首先我们考虑下这个问题的不同之处在于,有一个区间对x取max的操作。
那么如何维护这个操作呢?
就是对于线段树的区间,维护一个最大值标记,最大值出现次数,以及严格次大值。
接下来考虑处理操作。
首先如果x>maxv[o]证明已经是无所谓的,所以应该直接放弃。
如果v处于semx[o]<x<maxv[o],证明只有最大值需要被修改。
其他的情况就继续向下递进就可以了。
那么我们证明一下为什么这么做复杂度是对的。
首先,如同论文中所说的,对于每个maxv可以看作是一个标记,把相同的maxv合并到第一个点,
可以发现semx的含义就是子树中最大的maxv。(因为最大值已经被缩到了这个点上)
每次暴力进入这些节点的时候,实际上就是将标记进行合并。
(也就是文章中所说的标记回收的理论)
这个题的难点就是为什么我这么暴力的回收依然可以是一个log的。
在每一次操作后会产生一类新的标记。
那么每次标记回收实际上就是有一类标记的权值-=1
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e6+;
int a[N],n,m;
struct Segment_Tree{
#define lson (o<<1)
#define rson (o<<1|1)
int maxv[N<<],cntv[N<<],semx[N<<];
ll sumv[N<<];
inline void pushup(int o){
sumv[o]=sumv[lson]+sumv[rson];
maxv[o]=max(maxv[lson],maxv[rson]);
semx[o]=max(semx[lson],semx[rson]);cntv[o]=;
if(maxv[lson]!=maxv[rson])semx[o]=max(semx[o],min(maxv[lson],maxv[rson]));
if(maxv[o]==maxv[lson])cntv[o]+=cntv[lson];
if(maxv[o]==maxv[rson])cntv[o]+=cntv[rson];
}
inline void puttag(int o,int v){
if(v>=maxv[o])return;
sumv[o]+=1LL*(v-maxv[o])*cntv[o];maxv[o]=v;
}
inline void pushdown(int o){puttag(lson,maxv[o]);puttag(rson,maxv[o]);}
inline void build(int o,int l,int r){
if(l==r){
sumv[o]=maxv[o]=a[l];cntv[o]=;semx[o]=-;
return;
}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o);
}
inline void optmax(int o,int l,int r,int ql,int qr,int v){
if(v>=maxv[o])return;
if(ql<=l&&r<=qr&&v>semx[o]){puttag(o,v);return;}
int mid=(l+r)>>;pushdown(o);
if(ql<=mid)optmax(lson,l,mid,ql,qr,v);
if(qr>mid)optmax(rson,mid+,r,ql,qr,v);
pushup(o);
}
inline ll querysum(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sumv[o];
int mid=(l+r)>>;pushdown(o);ll ans=;
if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr);
if(qr>mid)ans+=querysum(rson,mid+,r,ql,qr);
return ans;
}
inline int querymax(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return maxv[o];
pushdown(o);int mid=(l+r)>>,ans=-;
if(ql<=mid)ans=max(ans,querymax(lson,l,mid,ql,qr));
if(qr>mid)ans=max(ans,querymax(rson,mid+,r,ql,qr));
return ans;
}
}sgt;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
int T=read();
while(T--){
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
sgt.build(,,n);
while(m--){
int opt=read(),l=read(),r=read();
if(opt==){
int v=read();
sgt.optmax(,,n,l,r,v);
}
if(opt==)printf("%d\n",sgt.querymax(,,n,l,r));
if(opt==)printf("%lld\n",sgt.querysum(,,n,l,r));
}
}
}
【HDU5306】Gorgeous Sequence的更多相关文章
- 【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】【DTOJ2481】Gorgeous Sequence【线段树】
题目大意:给你一个序列a,你有三个操作,0: x y t将a[x,y]和t取min:1:x y求a[x,y]的最大值:2:x y求a[x,y]的sum 题解:首先很明显就是线段树裸题,那么考虑如何维护 ...
- 【arc071f】Infinite Sequence(动态规划)
[arc071f]Infinite Sequence(动态规划) 题面 atcoder 洛谷 题解 不难发现如果两个不为\(1\)的数连在一起,那么后面所有数都必须相等. 设\(f[i]\)表示\([ ...
- 【arc074e】RGB Sequence(动态规划)
[arc074e]RGB Sequence(动态规划) 题面 atcoder 洛谷 翻译见洛谷 题解 直接考虑暴力\(dp\),设\(f[i][j][k][l]\)表示当前考虑到第\(i\)位,最后一 ...
- 【BZOJ1367】[Baltic2004]sequence 左偏树
[BZOJ1367][Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sampl ...
- 【BZOJ3043】IncDec Sequence 乱搞
[BZOJ3043]IncDec Sequence Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要 ...
- 【POJ2778】DNA Sequence(AC自动机,DP)
题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...
- 【leetcode】 Permutation Sequence (middle)
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
随机推荐
- 【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp
题目描述 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= N < ...
- BZOJ3124 SDOI2013直径
本以为必有高论,结果是个思博题.随便找一条直径,最后答案肯定是这条直径上的连续一段,如果某分支长度等于直径上某端的长度这一端都要被剪掉. #include<iostream> #inclu ...
- CentOS 转义字符
常用转义字符 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串. 单引号(''):转义其中所有的变量为单纯的字符串. 双引号(""):保留其中的变量属性,不进行转义处理. 反引 ...
- 【题解】Atcoder AGC#03 E-Sequential operations on Sequence
仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...
- [luogu1654]OSU!
update 9.20:本篇题解已经被\(yyb\)证明是出锅的 这道题目最后的式子看上去是很简单的,不到10行就码完了,但是求式子的过程并没有那么简单. 很容易想到一种枚举思路: 因为每一段连续的1 ...
- [51nod1325]两棵树的问题
description 题面 solution 点分治+最小割. 点分必选的重心,再在树上dfs判交,转化为最大权闭合子图. 可以做\(k\)棵树的情况. code #include<iostr ...
- ssm框架pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 算法学习 并查集(Union-Find) (转)
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...
- props设置state误区
class Component extends React.Component { constructor(props) { super(props); this.state = { value: t ...
- 一种高效的寻路算法 - B*寻路算法
在此把这个算法称作B* 寻路算法(Branch Star 分支寻路算法,且与A*对应),本算法适用于游戏中怪物的自动寻路,其效率远远超过A*算法,经过测试,效率是普通A*算法的几十上百倍. 通过引入该 ...