社区讨论
ABC360G的795B短代码WAx1,码风不优良
学术版参与者 4已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @ly1ml9js
- 此快照首次捕获于
- 2024/06/30 22:07 2 年前
- 此快照最后确认于
- 2024/07/01 10:24 2 年前
想法是,先把LIS搞出来(令其为
CPPdp[pos],pos尽量靠左),让这段LIS的左端点l尽量靠右,右端点r尽量靠左,如果不是l=1,r=n,则答案一定为dp[pos]+1;如果l=1,r=n,并且LIS序列中数值连续或下标连续(即不能在中间插入一个数),则答案为dp[pos],反之为dp[pos]+1#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
int n,a[MAXN],h[MAXN],dp[MAXN],pre[MAXN];
inline int bin(int key){
int l=0,r=n,mid=(l+r)>>1;
while(l+1<r){
if(a[h[mid]]<key) l=mid;
else r=mid;
mid=(l+r)>>1;
}return l;
}inline int find(int id){
if(!pre[id]) return id;
return find(pre[id]);
}
int main(){
cin>>n;
for(int i=1;i<=n;++i) h[i]=n+1;h[0]=0,a[n+1]=1e9+1;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i){
pre[i]=h[bin(a[i])],dp[i]=dp[pre[i]]+1;
if(a[h[dp[i]]]>=a[i]) h[dp[i]]=i;
}int pos=1;
for(int i=2;i<=n;++i)if(dp[pos]<dp[i]) pos=i;
int l=find(pos);
if(pos<n||l>1){cout<<dp[pos]+1<<endl;return 0;}
if(a[pos]-a[l]+1==dp[pos]||pos-l+1==dp[pos]) cout<<dp[pos]<<endl;
else cout<<dp[pos]+1<<endl;
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...