题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1318

  这道题的大意是要求一个长度为len,并包含1~len所有数,并使len最大的子区间。开始看题的时候一脸懵逼(好像可以二分?),然后写到一半突然发现二分有反例。

  于是上网搜了一波题解。

  正确解法:

  我们可以发现这个区间必定满足这样的性质:假设它的长度为len,则区间内最大值为len,区间内所有数的和为(len+1)*len/2,并且区间内所有数两两不相等。

  因为区间内一定包含1,所以我们可以以1为界点划分整个序列。然后我们假设区间内的最大值在1的左侧,于是从当前的1开始向左枚举,并把从当前枚举到的数到1之间的最大值作为区间的长度,然后用上面的法则判断该区间是否合法。因为求区间和明显比区间最大值方便,所以我们就用前缀和求出当前区间的和来判断。判断区间里是否有相同的数,只需维护一个nxt数组,每个数右边第一个相同的数出现的位置,然后一边枚举一边更新合法区间的右端点(即与区间内的数有冲突的最左边一个数)。

  代码:

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 1000020
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
using namespace std;
int a[maxn],nxt[maxn];
int last[maxn];
ll sum[maxn];
int n;
int work(int n)
{
memset(last,,sizeof(last));
memset(nxt,,sizeof(nxt));
for(int i=;i<=n;i++){
sum[i]=sum[i-]+a[i];
if(last[a[i]])nxt[last[a[i]]]=i;
last[a[i]]=i;
}
for(int i=;i<=n;i++)if(!nxt[i])nxt[i]=n+;
int ans=;
for(int i=;i<=n;i++)
if(a[i]==){
ans=max(ans,);
if(i==)continue;
int r=nxt[i],mx=;
for(int j=i-;j>&&a[j]!=;j--){
r=min(r,nxt[j]); mx=max(mx,a[j]);
if(j+mx<=r&&sum[j+mx-]-sum[j-]==1ll*(mx+)*mx/)ans=max(ans,mx);
}
}
return ans;
}
int main()
{
n=read();
for(int i=;i<=n;i++)a[i]=read();
int ans1=work(n);
for(int i=;i*<=n;i++){
int tmp=a[i]; a[i]=a[n-i+]; a[n-i+]=tmp;
}
int ans2=work(n);
printf("%d\n",max(ans1,ans2));
return ;
}

bzoj1318

最新文章

  1. 【迁移】—Entity Framework实例详解 转
  2. java语法基本知识2
  3. 【耐克】【空军一号 Nike Air Force 1】【软木塞】
  4. C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
  5. Linux Shell系列教程之(十五) Shell函数简介
  6. [py]os.walk爬目录&sys.argv灵活获取参数
  7. Flask服务入门案例
  8. JQuery 绑定事件时传递参数的实现方法
  9. IntentService的使用
  10. gitbook 入门教程之主题插件
  11. JTAG各类接口针脚定义及含义
  12. Java基础(进制转换-)
  13. PYTHON3-LIST.SORT(),SORTED()方法详解。
  14. liunx 运维知识二部分
  15. name设置id的方式 解决多个单选域冲突现象 同时有利于从动态网页取值
  16. MT【31】傅里叶级数为背景的三角求和
  17. java.lang.UnsatisfiedLinkError:no dll in java.library.path
  18. OLTP和OLAP有何区别?
  19. 【python-opencv】几何变换
  20. Appium 服务关键字(转)

热门文章

  1. W​o​r​d​P​r​e​s​s​常​用​标​签​和​调​用​总​结
  2. 守护进程监控tomcat并自己主动重新启动
  3. angularjs 遇见$scope,xxx=function()报错为该函数未定义
  4. You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine.
  5. Java基础—序列化与反序列化(转载)
  6. Django基础(三)_分页器、COOKIE与SESSION、FORM表单
  7. JavaScript:学习笔记(2)——基本概念与数据类型
  8. iOS 关于远程推送(push) 的几个问题
  9. HTML+CSS理解
  10. Linux下32位与64位数据类型大小