在数轴上的 [0,n][0,n][0,n] 区间,有 mmm 个障碍位于区间内的若干个整点坐标,将 [0,n][0, n][0,n] 区间分隔成了若干段。
如上图所示,红色表示障碍,[0,10][0,10][0,10] 区间被三个障碍分隔形成了四段:[0,3],[3,6],[6,9],[9,10][0,3],[3,6],[6,9],[9,10][0,3],[3,6],[6,9],[9,10],它们的长度分别为:3,3,3,13,3,3,13,3,3,1。
现在可以从中移除任意多个障碍,称移除的障碍数量为 xxx,并称此时区间 [0,n][0,n][0,n] 内最长段的长度为 LLL。
请最大化 L−x2L-x^2L−x2 的值,输出这个值。
输入描述:
第一行输入两个正整数 1≤n≤2×105,1≤m≤min(n+1,105)1\le n \le 2\times 10^5,1\le m\le \min(n + 1,10^5)1≤n≤2×105,1≤m≤min(n+1,105),分别表示区间的右端点和障碍的数量。 第二行输入 mmm 个互不相同的正整数 0≤ai≤n0\le a_i \le n0≤ai≤n 以空格相隔,第 iii 个正整数 aia_iai 表示第 iii 个障碍的位置。
输出描述:
第一行输出一个整数,表示答案。
示例1
输入
10 3 3 6 9
输出
5
说明
移除第二个障碍 ai=6a_i=6ai=6,此时 L=9−3=6L=9-3=6L=9−3=6(即第一个障碍与第三个障碍之间的区间长度),x=12=1x=1^2=1x=12=1,答案即 6−1=56-1=56−1=5。
可以发现,这是最优的情况。
示例2
输入
3 3 1 2 3
输出
1
根据数据大小,可以分析出其实只需要枚举最多500个挡板的位置,此时的值才至少不会小于1(假如每个位置都有挡板,此时是最坏的情况,式子的最大值为1)。由于只有连续抽去挡板才可以使式子的值最大,所以按顺序抽出即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n,m;
cin>>n>>m;
vector<int> v;
for(int i=0;i<m;i++)
{
int x;
cin>>x;
v.push_back(x);
}
v.push_back(0);
v.push_back(n);
sort(v.begin(),v.end());
int maxn=0xc0c0c0c0;
for(int i=0;i<min((int)v.size(),500);i++)
{
for(int j=0;j<v.size();j++)
{
if(i+j+1<v.size())
{
maxn=max(maxn,v[i+j+1]-v[j]-i*i);
}
}
}
cout<<maxn<<endl;
return 0;
}