RE 求调
查看原帖
RE 求调
906057
ELECTRODE_kaf楼主2024/10/15 21:12
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define rep(i,x,y) for(ll i=x;i<=y;i++)

const ll N=5e5+10;
ll n,a[N],dp[N][2],w[N],sgtr[N<<2];

ll ls(ll p) {
	return p<<1;
}

ll rs(ll p) {
	return p<<1|1;
}

ll pushup(ll p) {
	sgtr[p]=max(sgtr[ls(p)],sgtr[rs(p)]);
}

ll query(ll p,ll l,ll r,ll ql,ll qr) {
	if(qr<l||r<ql) return -1e9;

	if(ql<=l&&qr>=r) return sgtr[p];

	ll mid=l+r>>1,ret=-1e9;
	ret=max(ret,query(ls(p),l,mid,ql,qr));
	ret=max(ret,query(rs(p),mid+1,r,ql,qr));
	return ret;
}

void upd(ll p,ll l,ll r,ll ql,ll v) {
//	cout<<"upd:"<<l<<' '<<r<<'\n';

	if(ql<l||ql>r) return;

	if(l==r) sgtr[p]=max(sgtr[p],v);
	else {
		ll mid=l+r>>1;

		if(ql<=mid) upd(ls(p),l,mid,ql,v);
		else upd(rs(p),mid+1,r,ql,v);

		pushup(p);
	}
}

int main() {
	cin>>n;

	rep(i,1,n) cin>>a[i];

	memset(w,-0x5f,sizeof(w));
//	memset(sgtr,-0x5f,sizeof(sgtr));

	rep(i,1,n) {
//		cout<<"i="<<i<<'\n';
		dp[i][0]=max(dp[i][0],w[a[i]]+1);
		dp[i][1]=max(dp[i][1],max(query(1,1,N-10,1,a[i]-1),query(1,1,N-10,a[i]+1,N-10))+1);
		
//		if(i==4) cout<<"res1="<<query(1,1,N-10,1,a[i]-1)<<",res2="<<query(1,1,N-10,a[i]+1,N-10)<<'\n';
		
//		cout<<"dp[i][0]="<<dp[i][0]<<'\n'<<"dp[i][1]="<<dp[i][1]<<'\n';
//		cout<<"query done\n";
		w[a[i]]=max(w[a[i]],dp[i][1]);
		upd(1,1,N-10,a[i],dp[i][0]);
//		cout<<"upd done\n";
	}

	ll ans=0;

	rep(i,1,n) {
		ans=max(ans,dp[i][0]);
		
//		if(dp[i][0]==6) cout<<"wrong on "<<i<<'\n';
	}

	cout<<ans;
}
2024/10/15 21:12
加载中...