我是一个新手,就按照题解的思路写了一个树状数组,然后奇怪的事情发生了。我只有100分。我开了o2优化之后就有150分,比较迷糊。 代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[100005],a[100005],n;
int lowbit(int x){return x&(-x);}
int big,ans1,ans2;
int ask1(int x){
int res=0;
for(int i=x;i>0;i-=lowbit(i))
res=max(res,f[i]);
return res;
}
void add1(int x,int v){
for(int i=x;i<=big;i+=lowbit(i))
f[i]=max(f[i],v);
}
int ask2(int x){
int res=0;
for(int i=x;i<=big;i+=lowbit(i))
res=max(res,f[i]);
return res;
}
void add2(int x,int v){
for(int i=x;i>0;i-=lowbit(x))
f[i]=max(f[i],v);
}
int main(){
n=0;big=0;
while(~scanf("%d",&a[n])){
big=max(big,a[n]);
n++;
}
for(int i=0;i<n;i++){//记录最长单调上升子序列
int x=ask1(a[i])+1;
//树状数组维护的是:长度最大值
//0~a[i]中的最大值加一
ans2=max(ans2,x);
add1(a[i]+1,x);
//确保是严格单调递增的
}
memset(f,0,sizeof(f));
for(int i=0;i<n;i++){
//记录最长单调不上升子序列
int x=ask2(a[i])+1;
//树状数组维护的是:长度最大值
//a[i]~big中的最大值加一
ans1=max(ans1,x);
add2(a[i],x);
//确保是不严格单调递减的
}
printf("%d\n%d",ans1,ans2);
return 0;
}