求助MLE,原因
查看原帖
求助MLE,原因
1041641
weiyuchang楼主2024/11/25 20:42

用线段树做的,将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;
}

2024/11/25 20:42
加载中...