bzoj4149: [AMPPZ2014]Global Warming
头都烂了怎么头疼啊
考虑先做出对于一个位置以它作为唯一最小值的最远区间,这个可以单调栈上二分搞出来
那么对于一个位置这个区间而言,一定是选择这个区间的最大数是作为最终的唯一最大数最优的
为什么呢?我们可以把区间起止和区间之中的最大数下标弄出来,那么当前位置一定位于某两个弄出来的编号之间,其他数的答案不会大于这个区间大小,而假如是最大数除了包含这个区间以外还可以向一边拓展直到遇到下一个最大数
那么二分找出这两个编号就好了,RMQ上个st表
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector> #define qq(o,l,x) upper_bound(o+1,o+l+1,x)-o-1
using namespace std;
const int _=1e2;
const int maxn=*1e5+_;
const int fbin=;
int n,a[maxn],lslen,ls[maxn];
int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
} //--------------------------------------def------------------------------------------ struct stack
{
int top,sta[maxn],d[maxn];
stack(){}
void clear(int k){top=;}
void push(int p,int x)
{
while(top>=&&d[top]>=x)top--;
sta[++top]=p;d[top]=x;
}
int findmner(int x){return sta[qq(d,top,a[x])];}
};
//~~~~~~~~stack~~~~~~~~~ int Bin[fbin],Log[maxn],f[fbin][maxn],d[fbin][maxn];
void initst()
{
Bin[]=;for(int i=;i<=;i++)Bin[i]=Bin[i-]*;
Log[]=;for(int i=;i<=n; i++)Log[i]=Log[i/]+;
for(int i=;i<=n;i++)f[][i]=a[i];
for(int j=;Bin[j]<=n;j++)
for(int i=;i+Bin[j]-<=n;i++)
f[j][i]=max(f[j-][i],f[j-][i+Bin[j-]]),
d[j][i]=max(d[j-][i],d[j-][i+Bin[j-]]);
}
int RMQ(int x,int y)
{
int k=Log[y-x+];
return max(f[k][x],f[k][y-Bin[k]+]);
}
//~~~~~~~~RMQ~~~~~~~~~~~ //--------------------------------------data structure----------------------------------------- int mnL[maxn],mnR[maxn];//作为唯一最小的区间
stack up;vector<int>vec[maxn];
int main()
{
freopen("26.in","r",stdin);
freopen("a.out","w",stdout);
n=read();
for(int i=;i<=n;i++)
a[i]=read(),ls[++lslen]=a[i];
sort(ls+,ls+lslen+);
lslen=unique(ls+,ls+lslen+)-ls-;
for(int i=;i<=n;i++)
{
a[i]=lower_bound(ls+,ls+lslen+,a[i])-ls;
vec[a[i]].push_back(i);
}
initst(); up.clear(),up.push(,-(<<));
for(int i=;i<=n;i++)
mnL[i]=up.findmner(i)+,up.push(i,a[i]);
up.clear(),up.push(n+,-(<<));
for(int i=n;i>=;i--)
mnR[i]=up.findmner(i)-,up.push(i,a[i]); int ans=,ll;
for(int i=;i<=n;i++)
{
int p=RMQ(mnL[i],mnR[i]);
if(vec[p].front()<=i)
{
int u=upper_bound(vec[p].begin(),vec[p].end(),i)-vec[p].begin()-;
int L=mnL[i],R=mnR[i];
if(u!=)L=max(L,vec[p][u-]+);
if(u!=vec[p].size()-)R=min(R,vec[p][u+]-); if(R-L+>ans || R-L+==ans&&ll>L )ans=R-L+,ll=L;
}
if(vec[p].back()>=i)
{
int u=lower_bound(vec[p].begin(),vec[p].end(),i)-vec[p].begin();
int L=mnL[i],R=mnR[i];
if(u!=)L=max(L,vec[p][u-]+);
if(u!=vec[p].size()-)R=min(R,vec[p][u+]-); if(R-L+>ans || R-L+==ans&&ll>L )ans=R-L+,ll=L;
}
}
printf("%d %d\n",ans,ll); return ;
}
bzoj4149: [AMPPZ2014]Global Warming的更多相关文章
- 【BZOJ4149】[AMPPZ2014]Global Warming 单调栈+RMQ+二分
[BZOJ4149][AMPPZ2014]Global Warming Description 给定一个序列a[1],a[2],...,a[n].请从中选出一段连续子序列,使得该区间最小值唯一.最大值 ...
- 10324 Global Warming dfs + 二分
时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description Global warming is a big prob ...
- [CEOI2018]Global warming
[CEOI2018]Global warming 题目大意: 给定\(n(n\le2\times10^5)\),你可以将任意\(a_{l\sim r}(1\le l\le r\le n)\)每一个元素 ...
- BZOJ5442: [Ceoi2018]Global warming
BZOJ5442: [Ceoi2018]Global warming https://lydsy.com/JudgeOnline/problem.php?id=5442 分析: 等价于后缀加(前缀减也 ...
- BZOJ 5442: [Ceoi2018]Global warming
[l,r]+x不如[l,n]+x [l,r]-x不如(r,n)+x 所以等价于只有[l,n]+x 枚举断点树状数组合并 难度在于想到这个贪心 #include<cstdio> #inclu ...
- AMPPZ2014
[AMPPZ2014]The Lawyer 记录每天结束的最早的会议以及开始的最晚的会议即可. #include<cstdio> #define N 500010 int n,m,i,d, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Emergency(山东省第一届ACM省赛)
Emergency Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Kudo’s real name is not Kudo. H ...
- Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
A. As Easy As Possible 每个点往右贪心找最近的点,可以得到一棵树,然后倍增查询即可. 时间复杂度$O((n+m)\log n)$. #include <bits/stdc+ ...
随机推荐
- c++ primer note
---恢复内容开始--- 1.decltype 2.auto 3.cbegin 4.cend 5.constexpr 6.(*Parray)[10]=&arr; //Parray 指向一个含有 ...
- bzoj2648/2716 kdtree
SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 5199 Solved: 1813[Submit][Status][Discuss] D ...
- STL中heap用法
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; ]={,, ...
- HDU [P3949] XOR
线性基求第 k 小异或值 http://www.cnblogs.com/Mr-WolframsMgcBox/p/8567844.html 这道题消元下来是一个上三角矩阵,代码简单,但是不使用与本题的情 ...
- Linux shell中的竖线(|)——管道符号
管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为comma ...
- hdu 4960 记忆化搜索 DP
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- hdu 4883
简单题,当时竟然没有敲出来╮(╯▽╰)╭... 方法:每个时间点排序从小到大排序,之后扫一遍即可:是进的时间点就加人,反之出人.更新最大值即可....囧... #include<iostream ...
- IOC基本理解
什么是IOC? IOC全称为控制反转(Inversion Of Control),别名依赖注入(Dependency Injection). 控制反转即指我们获取依赖的方式发生了反转. 假设存在如下情 ...
- 6.JAVA语言基础部分--数据库操作
操作数据数据流程:得到Connecnt->获取Statement对象->执行sql语句返回ResultSet 1.通过DriverManager.getConnection("j ...
- android开发教程之使用线程实现视图平滑滚动示例 改
package com.melonsapp.messenger.ui.popupuser; import android.os.Handler; import android.view.View; i ...