求助:树状数组TLE
查看原帖
求助:树状数组TLE
533419
北航姜广20376155楼主2021/12/20 17:45

我是一个新手,就按照题解的思路写了一个树状数组,然后奇怪的事情发生了。我只有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;
}
2021/12/20 17:45
加载中...