after contest WA 两个求调
查看原帖
after contest WA 两个求调
727630
dengchengyu楼主2024/7/6 09:44

link

#include<bits/stdc++.h>
using namespace std;
int n;
const int N=4e5+5;
int a[N];
int b[N];
int dp[N][2];
struct tree{
	int s[N];
	int lowbit(int &x){
		return x&(-x);
	}
	void update(int x,int y){
		while(x<N)s[x]=max(s[x],y),x+=lowbit(x);
	}
	int query(int x){
		int sum=0;
		while(x)sum=max(sum,s[x]),x-=lowbit(x);
		return sum;
	}
}s0,s1;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i],b[i+n]=a[i]+1;
	}
	sort(b,b+1+2*n);
	int len=unique(b,b+1+2*n)-b-1;
	for(int i=1;i<=n;i++)a[i]=lower_bound(b,b+1+len,a[i])-b+1;
	int ans=0;
	for(int i=1;i<=n;i++){
		if(i>1)dp[i][1]=max(dp[i][1],s0.query(a[i]-2)+2);
		dp[i][1]=max(dp[i][1],s1.query(a[i]-1)+1);
		s1.update(a[i],dp[i][1]);
		if(i>1)s0.update(a[i-1],dp[i-1][0]);
		dp[i][0]=max(dp[i][0],s0.query(a[i]-1)+1);
		ans=max(ans,max(dp[i][1],dp[i][0]));
//		cout<<dp[i][0]<<" "<<dp[i][1]<<endl;
	}
	cout<<ans;
}

2024/7/6 09:44
加载中...