【题解】P5978 [CEOI2018] Global warming
目前的最优解。
Description
给定长度为
Solution
如果将
对于
我们进一步分析,可以发现将
暴力修改 + LIS 的复杂度是
当然,你也可以离散化后用树状数组求最大值,复杂度不变,只是代码复杂一些,欢迎读者思考。
Code
#include <bits/stdc++.h>
#define Rint register int
using namespace std;
const int N=2e5+5;
int n,x,a[N],lis[N],L[N],R[N],ans;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read(),x=read();
for(Rint i=1;i<=n;++i)a[i]=read();
memset(lis,0x7f,sizeof(lis));
for(Rint i=1;i<=n;++i)
{
int j=lower_bound(lis,lis+n,a[i])-lis;
lis[j]=a[i];L[i]=j+1;ans=max(ans,L[i]);
}
memset(lis,0x7f,sizeof(lis));
for(Rint i=n;i>=1;--i)
{
int j=lower_bound(lis,lis+n,-a[i]+x)-lis;
int jj=lower_bound(lis,lis+n,-a[i])-lis;
lis[jj]=-a[i];ans=max(ans,L[i]+j);
}
printf("%d",ans);
return 0;
}