头都烂了怎么头疼啊

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

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

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

那么二分找出这两个编号就好了,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的更多相关文章

  1. 【BZOJ4149】[AMPPZ2014]Global Warming 单调栈+RMQ+二分

    [BZOJ4149][AMPPZ2014]Global Warming Description 给定一个序列a[1],a[2],...,a[n].请从中选出一段连续子序列,使得该区间最小值唯一.最大值 ...

  2. 10324 Global Warming dfs + 二分

    时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC Description Global warming is a big prob ...

  3. [CEOI2018]Global warming

    [CEOI2018]Global warming 题目大意: 给定\(n(n\le2\times10^5)\),你可以将任意\(a_{l\sim r}(1\le l\le r\le n)\)每一个元素 ...

  4. BZOJ5442: [Ceoi2018]Global warming

    BZOJ5442: [Ceoi2018]Global warming https://lydsy.com/JudgeOnline/problem.php?id=5442 分析: 等价于后缀加(前缀减也 ...

  5. BZOJ 5442: [Ceoi2018]Global warming

    [l,r]+x不如[l,n]+x [l,r]-x不如(r,n)+x 所以等价于只有[l,n]+x 枚举断点树状数组合并 难度在于想到这个贪心 #include<cstdio> #inclu ...

  6. AMPPZ2014

    [AMPPZ2014]The Lawyer 记录每天结束的最早的会议以及开始的最晚的会议即可. #include<cstdio> #define N 500010 int n,m,i,d, ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. Emergency(山东省第一届ACM省赛)

    Emergency Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Kudo’s real name is not Kudo. H ...

  9. Moscow Pre-Finals Workshop 2016. National Taiwan U Selection

    A. As Easy As Possible 每个点往右贪心找最近的点,可以得到一棵树,然后倍增查询即可. 时间复杂度$O((n+m)\log n)$. #include <bits/stdc+ ...

随机推荐

  1. 【bzoj2393】Cirno的完美算数教室 数论容斥

    Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数 ...

  2. Linux性能分析Top

    前言 在实际开发中,有时候会收到一些服务的监控报警,比如CPU飙高,内存飙高等,这个时候,我们会登录到服务器上进行排查.本篇博客将涵盖这方面的知识:Linux性能工具. 一次线上问题排查模拟 背景:服 ...

  3. 【Vim命令大全】史上最全的Vim命令

    曾经使用了两年多的Vim,手册也翻过一遍.虽然现在不怎么用vim了,曾经的笔记还是贴出来,与喜欢vim的朋友分享. 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器. 虽然 ...

  4. linux下查看隐藏文件

    linux下查看隐藏文件的快捷键:Ctrl+H 命令:ls -a

  5. Redis数据库No-SQL的介绍安装和使用

    Redis安装步骤 1.官网下载Redis压缩包http://download.redis.io/releases/redis-5.0.2.tar.gz,然后将下载的redis上传到虚拟机的/usr/ ...

  6. kafka exactly-once

    2018年,Apache Kafka以一种特殊的设计和方法实现了强语义的exactly-once和事务性. 这篇文章将讲解kafka中exactly-once和事务操作的原理,具体为 (1)exact ...

  7. [vxlan] 二 什么是VXLAN

    VXLAN是一种mac in UDP的技术.简单讲就是传统的二层帧被封装到了UDP的package中.通过UDP的IP网络发送到目的地然后再解封装. VXLAN 跟VLAN对比,最重要的一个概念就是V ...

  8. android Activity生命周期的例子

    package com.example.yanlei.yl2; import android.app.AlertDialog; import android.content.DialogInterfa ...

  9. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...

  10. mysql 同样内容的字段合并为一条的方法

    从两个表中内联取出的数据,当中category_name字段有同样内容,想将具有同样内容的字段进行合并,将amount字段进行加法运算,变成下表中的内容 url=http%3A%2F%2Fdev.my ...