社区讨论

ABC360G的795B短代码WAx1,码风不优良

学术版参与者 4已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@ly1ml9js
此快照首次捕获于
2024/06/30 22:07
2 年前
此快照最后确认于
2024/07/01 10:24
2 年前
查看原帖
想法是,先把LIS搞出来(令其为dp[pos]pos尽量靠左),让这段LIS的左端点l尽量靠右,右端点r尽量靠左,如果不是l=1,r=n,则答案一定为dp[pos]+1;如果l=1,r=n,并且LIS序列中数值连续或下标连续(即不能在中间插入一个数),则答案为dp[pos],反之为dp[pos]+1
CPP
#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 条回复,欢迎继续交流。

正在加载回复...