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;
}