AC一半TLE一半
查看原帖
AC一半TLE一半
1365062
Deric456楼主2024/8/16 10:58

这是O(N²)的算法

求各位大佬改成O(N log N)的算法

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n=0,m=0;
	int a[100001];//飞来的导弹高度
	int b[100001];//最长下降子序列的长度
	int height[100001];//每个拦截系统还能拦截的高度
	height[0]=50005;
	for(int i=1;cin>>a[i];i++){
		
		int maxx=0;//最大高度 
		//计算前i-1个导弹以a[i]最后一个的最长下降子序列
		for(int j=1;j<i;j++){
			if(a[j]>=a[i] && b[j]>maxx) 
				maxx=max(b[j],maxx);
		}
		b[i]=maxx+1;
		m=max(b[i],m);
		
		//飞过来一个导弹找最优拦截系统,找不到拦截系统加一
		int x=0;//最优拦截系统下标
		for(int j=1;j<=n;j++){
			if(height[j]>=a[i]&&height[j]<height[x]){
				x=j;
			}
		}
		if(x==0){
			n++;
			x=n;
		}
		height[x]=a[i];
	}
	cout<<m<<endl<<n<<endl;
	return 0;
}
2024/8/16 10:58
加载中...