ABC G 求调
  • 板块学术版
  • 楼主assert_0
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/1 19:00
  • 上次更新2024/7/1 19:09:20
查看原帖
ABC G 求调
532536
assert_0楼主2024/7/1 19:00

RT WA*2

#include<bits/stdc++.h> 
using namespace std;
#define int long long
#define N 410000
int t,n,a[N],ans,f[N],g[N],c1[N],c2[N],minn1[N],minn2[N],flag1[N],flag2[N],pre;
pair<int,int> fr[N],ba[N]; 
map<int,int> mp,to;
map<pair<int,int>,int> cnt;
inline int lowbit(int x){
	return x&(-x);
} 
void add1(int x,int k){
	int pre=x;
	while(x<=N-1){
		if(k>c1[x]){
			c1[x]=k;
			minn1[x]=pre;
		}
		else if(k==c1[x]){
			minn1[x]=min(minn1[x],pre);
		}
		x+=lowbit(x);
	}
	return ;
}
pair<int,int> query1(int x){
	int ans=0,t=1e18;
	while(x){
		if(c1[x]>ans){
			ans=c1[x];
			t=minn1[x];
		}
		else if(c1[x]==ans){
			t=min(t,minn1[x]);
		} 
		x-=lowbit(x);
	}
	return make_pair(ans,t);
}
void add2(int x,int k){
	int pre=x;
	while(x<=N-1){
		if(k>c2[x]){
			c2[x]=k;
			minn2[x]=pre;
		}
		else if(k==c2[x]){
			minn2[x]=min(minn2[x],pre);
		}
		x+=lowbit(x);
	}
	return ;
}
pair<int,int> query2(int x){
	int ans=0,t=1e18;
	while(x){
		if(c2[x]>ans){
			ans=c2[x];
			t=minn2[x];
		}
		else if(c2[x]==ans){
			t=min(t,minn2[x]);
		} 
		x-=lowbit(x);
	}
	return make_pair(ans,t);
}
signed main(){
	memset(minn1,0x3f3f3f,sizeof(minn1));
	memset(minn2,0x3f3f3f,sizeof(minn2));
	cin>>n;
	for(int i=1;i<=n;i++){
	    cin>>a[i];
		mp[a[i]]=1;
	}
	int cnt1=0;
	pre=-(long long)1e9;
	for(auto x:mp){
		if(x.first-pre==1){
			cnt1++;
		}
		else{
			cnt1+=2;
		}
		pre=x.first;
		to[x.first]=cnt1;
	}
	for(int i=1;i<=n;i++){
		a[i]=to[a[i]];
	}
	for(int i=1;i<=n;i++){
		pair<int,int> t=query1(a[i]-1);
		if(cnt[t]!=i-1){
			flag1[i]=1;
		}
		t.first++;
		if(cnt[make_pair(t.first,a[i])]==0){
			cnt[make_pair(t.first,a[i])]=i;
		}
		fr[i]=t;
		f[i]=t.first;
		ans=max(ans,f[i]);
		add1(a[i],f[i]);
	}
	cnt.clear();
	cnt[make_pair(0,1e18)]=n+1;
	for(int i=n;i>=1;i--){
		pair<int,int> t=query2(N-a[i]);
		if(cnt[t]!=i+1){
			flag2[i]=1;
		}
		t.first++;
		if(cnt[make_pair(t.first,N-a[i]+1)]==0){
			cnt[make_pair(t.first,N-a[i]+1)]=i;
		}
		ba[i]=t;
		g[i]=t.first;
		add2(N-a[i]+1,g[i]);
	}
	ans=max(f[n-1],g[2])+1;
	for(int i=2;i<=n-1;i++){
		if((fr[i].second<=a[i]-2&&flag1[i])||(N+1-ba[i].second>=a[i]+2&&flag2[i])){
			ans=max(ans,fr[i].first+ba[i].first);
		}
		else{
			ans=max(ans,fr[i].first+ba[i].first-1);
		}
	}
	cout<<ans<<endl;
    return 0;
}
2024/7/1 19:00
加载中...