L3-1 The Best Peak Shape

就是一道正反两边求lis(最长子序列问题)

吐槽 出题人是个瓜皮 题目上说了保证输出的unique 结果根本就没保证

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e4+5; 
int n,ans;
int dp1[maxn],dp2[maxn];
int c[maxn],a[maxn];
void upd(int x,int val){
	while(x<maxn)c[x]=max(c[x],val),x+=lowbit(x);
}
int query(int x){
	int res=0;
	while(x>0)res=max(res,c[x]),x-=lowbit(x);
	return res;
}
int main(){
	cin>>n;	
	for(int i=1;i<=n;i++)cin>>a[i],a[i]+=10005;
	dp1[1]=1;upd(a[1],1);
	for(int i=2;i<=n;i++){
		
		dp1[i]=query(a[i]-1)+1;
		upd(a[i],dp1[i]);
	}
	memset(c,0,sizeof(c));
	dp2[n]=1;upd(a[n],1);
	for(int i=n-1;i>=1;i--){
		dp2[i]=query(a[i]-1)+1;
		upd(a[i],dp2[i]);
	}
	bool pd=false;int ii;
	for(int i=2;i<n;i++){
		if(dp2[i]>1&&dp1[i]>1){
			if(dp1[i]+dp2[i]-1>=ans)//就是这里 必须是大于等于 不然就会掉些点
			ans=dp1[i]+dp2[i]-1,ii=i,pd=true;
		}
	}
	if(!pd)printf("No peak shape\n");
	else printf("%d %d %d\n",ans,ii,a[ii]-10005);
     return 0;
}

posted @ 2022-03-28 20:34  wzx_believer  阅读(34)  评论(0编辑  收藏  举报