HDU 5306 Gorgeous Sequence
如果维护max,sum,那么可以得到一个暴力方法,如果t>=max,那可以return,否则往下更新,显然超时。
在上面基础上,再维护一下次大值,与最大值的个数。这样一来,次大值<t<最大值 这样的情况也可以更新完了之后直接return,pushDown的话也很好操作。
实践证明,这样的复杂度降到了nlog(n),具体证明可以看吉如一论文。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} const int maxn=;
struct Seg
{
LL sum; int a,b,num;
bool flag;
}s[*maxn];
int T,n,m; int M(int a,int b)
{
if(a>b) return a;
return b;
} int CI(int x,int a,int b,int c,int d)
{
if(a==b&&a==c&&a==d) return x;
int res=;
if(a!=x) res=M(res,a);
if(b!=x) res=M(res,b);
if(c!=x) res=M(res,c);
if(d!=x) res=M(res,d);
return res;
} void pushUp(int rt)
{
s[rt].sum=s[*rt].sum+s[*rt+].sum;
s[rt].a=M(s[*rt].a,s[*rt+].a);
s[rt].b=CI(s[rt].a,s[*rt].a,s[*rt].b,s[*rt+].a,s[*rt+].b);
s[rt].num=;
if(s[*rt].a==s[rt].a) s[rt].num=s[rt].num+s[*rt].num;
if(s[*rt+].a==s[rt].a) s[rt].num=s[rt].num+s[*rt+].num;
} void pushDown(int rt)
{
if(s[rt].flag==) return;
int MAX=M(s[*rt].a,s[*rt+].a);
int t=s[rt].a;
if(s[*rt].a==MAX)
{
s[*rt].flag=;
s[*rt].sum=s[*rt].sum-(LL)(s[*rt].a-t)*s[*rt].num;
if(s[*rt].a==s[*rt].b) s[*rt].a=s[*rt].b=t;
else s[*rt].a=t;
} if(s[*rt+].a==MAX)
{
s[*rt+].flag=;
s[*rt+].sum=s[*rt+].sum-(LL)(s[*rt+].a-t)*s[*rt+].num;
if(s[*rt+].a==s[*rt+].b) s[*rt+].a=s[*rt+].b=t;
else s[*rt+].a=t;
}
s[rt].flag=;
} void build(int l,int r,int rt)
{
s[rt].num=s[rt].a=s[rt].b=s[rt].sum=;
s[rt].flag=;
if(l==r)
{
scanf("%d",&s[rt].a);
s[rt].b=s[rt].a;
s[rt].sum=(LL)s[rt].b;
s[rt].num=;
return;
}
int m=(l+r)/;
build(l,m,*rt);
build(m+,r,*rt+);
pushUp(rt);
} int f(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return s[rt].a;
int m=(l+r)/;
int x1=,x2=;
pushDown(rt);
if(L<=m) x1=f(L,R,l,m,*rt);
if(R>m) x2=f(L,R,m+,r,*rt+);
pushUp(rt);
return max(x1,x2);
} LL sum(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return s[rt].sum;
int m=(l+r)/;
LL x1=,x2=; pushDown(rt);
if(L<=m) x1=sum(L,R,l,m,*rt);
if(R>m) x2=sum(L,R,m+,r,*rt+);
pushUp(rt); return x1+x2; } void force(int t,int l,int r,int rt)
{
if(s[rt].a<=t) return; if(l==r)
{
s[rt].a=s[rt].b=s[rt].sum=t;
return ;
} if(s[rt].b<t)
{
s[rt].flag=;
s[rt].sum=s[rt].sum-(LL)(s[rt].a-t)*s[rt].num;
s[rt].a=t;
return;
} if(s[rt].b==s[rt].a)
{
s[rt].flag=;
s[rt].sum=s[rt].sum-(LL)(s[rt].a-t)*s[rt].num;
s[rt].b=s[rt].a=t;
return;
} pushDown(rt);
int m=(l+r)/,tag=;
if(s[*rt].a>t) force(t,l,m,*rt),tag=;
if(s[*rt+].a>t) force(t,m+,r,*rt+),tag=;
if(tag==) pushUp(rt);
} void update(int L,int R,int t,int l,int r,int rt)
{
if(s[rt].a<=t) return; if(L<=l&&r<=R)
{
force(t,l,r,rt);
return ;
}
pushDown(rt);
int m=(l+r)/,tag=;
if(L<=m&&s[*rt].a>t) update(L,R,t,l,m,*rt),tag=;
if(R>m&&s[*rt+].a>t) update(L,R,t,m+,r,*rt+),tag=;
if(tag==) pushUp(rt);
} int main()
{
scanf("%d",&T); while(T--)
{
scanf("%d%d",&n,&m);
build(,n,);
for(int i=;i<=m;i++)
{
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==)
{
int t; read(t);
update(x,y,t,,n,);
}
else if(op==) printf("%d\n",f(x,y,,n,));
else printf("%lld\n",sum(x,y,,n,));
}
}
return ;
}
HDU 5306 Gorgeous Sequence的更多相关文章
- 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 ...
- [HDU] 5306 Gorgeous Sequence [区间取min&求和&求max]
题解: 线段树维护区间取min求和求max 维护最小值以及个数,次小值 标记清除时,分情况讨论 当lazy>max1 退出 当max1>lazy>max2(注意不要有等号) 更新 否 ...
- HDU - 5306 Gorgeous Sequence (吉司机线段树)
题目链接 吉司机线段树裸题... #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3 ...
- HDU - 5306 Gorgeous Sequence 线段树 + 均摊分析
Code: #include<algorithm> #include<cstdio> #include<cstring> #define ll long long ...
- HDOJ 5306 Gorgeous Sequence 线段树
http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/ Gorgeous Sequence Time Limit: 6 ...
- HDU 5860 Death Sequence(死亡序列)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
随机推荐
- Semaphore初探
示例一: package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService; import java.util ...
- 【Spring】基于注解的实现SpringMVC+MySQL
目录结构: // contents structure [-] SprinigMVC是什么 SpringMVC工作原理 @Controller和@RequestMapping注解 @Controlle ...
- servlet笔记
开发servlet有三种方法: (1) 实现 Servlet接口 (2) 通过继承 GenericServlet (3) 通过继承 HttpServlet get提交和post提交的 ...
- svn服务器搭建-SuSE Linux Enterprise Server 11 SP3
svn存储版本数据也有2种方式: 1.bdb: 2.fsfs. 因为BDB方式在服务器中断时,有可能锁住数据(搞ldap时就深受其害,没法根治),所以还是FSFS方式更安全一点,我也选择这种方式. ...
- linux环境下搭建环境发布web项目
在公司真是学习了一下项目环境在linux下搭建和发布的过程,这是每个程序员都应该掌握的一个技能,将整理下为以后温习用,也乐于和为掌握这些技能的猿分享: 这里主要分为5部分:1.安装jdk,并配置环境变 ...
- Weblogic概念与基础
WebLogic Server 1.BEA WebLogic Server 1.Domain:域是个逻辑概念,用来组织管理一系列的应用服务器实例,中心配置文件Config.xml. 2.Cluster ...
- Submission
EI: ICIC Express Letters: http://www.icicelb.org/elb/index.html IJICIC: http://www.ijicic.net/ijicic ...
- Java代理模式汇总
简介 代理模式即Proxy Pattern,23种java常用设计模式之一.其定义为:对其他对象提供一种代理以控制对这个对象的访问. UML类图 静态代理 目标接口 public interface ...
- Python学习笔记——基础篇【第五周】——正在表达式(re.match与re.search的区别)
目录 1.正在表达式 2.正则表达式常用5种操作 3.正则表达式实例 4.re.match与re.search的区别 5.json 和 pickle 1.正则表达式 语法: import re # ...
- 窗口、easyui-window、easyui-panel、easyui-linkbutton
//窗口 <script type="text/javascript" src="js/jquery.min.js"></script> ...