用线段树做的,将query函数注释的那一行删掉为什么会MLE,不该是TLE吗。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned short int us;
const int N=1e5+100,V=5e4+10;
int tre[V<<2];
int a[N],x,maxn;
int ans1,ans2;
int dp[N];
int n;
void upd(int l,int r,int x,int k,int p){
if(l==r&&l==x){
tre[p]=k;
return ;
}
us mid=l+(r-l>>1);
if(x<=mid) upd(l,mid,x,k,p<<1);
else upd(mid+1,r,x,k,p<<1|1);
tre[p]=max(tre[p<<1],tre[p<<1|1]);
}
int query(int l,int r,int nl,int nr,int p){
// if(nr<nl) return 0;
if(nl<=l&&r<=nr) return tre[p];
int maxn=0;
us mid=l+(r-l>>1);
if(nl<=mid) maxn=max(maxn,query(l,mid,nl,nr,p<<1));
if(nr>mid) maxn=max(maxn,query(mid+1,r,nl,nr,p<<1|1));
return maxn;
}
int main(){
while(cin>>x) a[++n]=x;
for(int i=1;i<=n;i++) maxn=max(maxn,a[i]);
for(int i=1;i<=n;i++){
int maxx=query(1,maxn,a[i],maxn,1);
dp[i]=maxx+1;
ans1=max(ans1,dp[i]);
upd(1,maxn,a[i],dp[i],1);
}
cout<<ans1<<'\n';
for(int i=1;i<=n;i++) dp[i]=0;
for(int i=1;i<=V<<2;i++) tre[i]=0;
for(int i=1;i<=n;i++){
int maxx=query(1,maxn,1,a[i]-1,1);
dp[i]=maxx+1;
ans2=max(ans2,dp[i]);
upd(1,maxn,a[i],dp[i],1);
}
cout<<ans2<<'\n';
return 0;
}