头都烂了怎么头疼啊

考虑先做出对于一个位置以它作为唯一最小值的最远区间,这个可以单调栈上二分搞出来

那么对于一个位置这个区间而言,一定是选择这个区间的最大数是作为最终的唯一最大数最优的

为什么呢?我们可以把区间起止和区间之中的最大数下标弄出来,那么当前位置一定位于某两个弄出来的编号之间,其他数的答案不会大于这个区间大小,而假如是最大数除了包含这个区间以外还可以向一边拓展直到遇到下一个最大数

那么二分找出这两个编号就好了,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 ;
}

最新文章

  1. .Net缓存管理框架CacheManager(转)
  2. macbook 我们需要买吗
  3. Protocol Buffers(Protobuf)开发者指南---概览
  4. 转:python webdriver API 之上传文件
  5. mysql安装/启动报错汇总
  6. Winform合并多个Excel文件到一个文件中(源文件.xls,实际是.xml)
  7. Linux C编程--格式化I/O
  8. 关键字 final
  9. java 从零开始,学习笔记之基础入门&lt;Oracle_基础&gt;(三十三)
  10. Python之路Day5
  11. R12 付款过程请求-功能和技术信息 (文档 ID 1537521.1)
  12. ios压缩图片
  13. STM32F030如何正确配置IO口的复用功能
  14. putty 与winscp 区别
  15. HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)
  16. MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用
  17. JavaScript之正方教务系统自动化教评[插件-转载]
  18. 函数后面跟throw
  19. Seaweedfs-启动脚本
  20. 前端之 js的介绍和javascript的基础使用

热门文章

  1. ThinkPHP5.1入门
  2. html--添加、删除滚动条
  3. 一个强大的Android模拟器Genymotion
  4. Neo4j 第七篇:模式(Pattern)
  5. 洛谷—— P1605 迷宫
  6. Jetson TK1 五:移植工控机程序到板上
  7. 使用Crypto对数据进行加密解密
  8. mybatis注解@selectKey对于db2数据库的使用
  9. Angular2.X 笔记
  10. innodb 修改表共享空间为独立空间