P11187线段树优化dp求调
  • 板块学术版
  • 楼主rpyluogu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/13 12:23
  • 上次更新2024/10/13 14:11:27
查看原帖
P11187线段树优化dp求调
1049376
rpyluogu楼主2024/10/13 12:23

rt,悬关


#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[500005],dp[500005][2];
int tr[5000005],tr2[5000005];
void add(int p,int l,int r,int dep,int k){
	if(l==r){
		tr[p]=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(dep<=mid){
		add(p*2,l,mid,dep,k);
	} 
	else{
		add(p*2+1,mid+1,r,dep,k);
	} 
	tr[p]=max(tr[p*2],tr[p*2+1]);
}
int qucha(int p,int l,int r,int x,int y){
	if(r<x||l>y){
		return 0;
	}
	if(l>=x&&r<=y){
		return tr[p];
	}
	int sum=0;
	int mid=(l+r)>>1;
	if(x<=mid){
		sum=max(sum,qucha(p*2,l,mid,x,y));
	}
	if(mid<y){
		sum=max(sum,qucha(p*2+1,mid+1,r,x,y));
	}
	return sum;
}
void add2(int p,int l,int r,int dep,int k){
	if(l==r){
		tr2[p]=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(dep<=mid){
		add2(p*2,l,mid,dep,k);
	} 
	else{
		add2(p*2+1,mid+1,r,dep,k);
	} 
	tr2[p]=max(tr2[p*2],tr2[p*2+1]);
}
int qucha2(int p,int l,int r,int x,int y){
	if(r<x||l>y){
		return 0;
	}
	if(l>=x&&r<=y){
		return tr2[p];
	}
	int sum=0;
	int mid=(l+r)>>1;
	if(x<=mid){
		sum=max(sum,qucha2(p*2,l,mid,x,y));
	}
	if(mid<y){
		sum=max(sum,qucha2(p*2+1,mid+1,r,x,y));
	}
	return sum;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//freopen("pairing4.in","r",stdin); 
	cin>>n;
	int maxx=0;
	for(register int i=1;i<=n;i++){
		cin>>a[i];
		a[i]+=2;
		maxx=max(maxx,a[i]);
	}
	maxx++;
	int ans=0;
	for(register int i=1;i<=n;i++){
		dp[i][0]=qucha2(1,1,maxx,a[i],a[i])+1;
		add(1,1,maxx,a[i],dp[i][0]);
		dp[i][1]=max(qucha(1,1,maxx,1,a[i]-1),qucha(1,1,maxx,a[i]+1,maxx))+1;
		add2(1,1,maxx,a[i],dp[i][1]);
		ans=max(ans,dp[i][0]);
	}
	cout<<ans<<'\n';
	return 0;
}
2024/10/13 12:23
加载中...