TLE求助
查看原帖
TLE求助
241838
microchip楼主2024/9/5 21:15

用的线段树,TLE on #14,感觉复杂度没问题啊

#include<iostream>
#include<algorithm>
using namespace std;

struct node{
	int x,y;
}coin[200050];

int h,w,n,T[800050],P[800050],pos,val,f[200050],ans,maxn,num,op[200050];
string output;

bool cmp(node a,node b){
	if(a.x==b.x)return a.y<b.y;
	return a.x<b.x;
}

void add(int l,int r,int no){
	if(l>pos||r<pos)return;
	if(l==r){
		if(val>T[no])P[no]=num;
		T[no]=max(T[no],val);
		return;
	}int mid=(l+r)>>1;
	add(l,mid,no*2);
	add(mid+1,r,no*2+1);
	T[no]=max(T[no*2],T[no*2+1]);
	P[no]=(T[no*2]>=T[no*2+1]?P[no*2]:P[no*2+1]);
}

int find(int l,int r,int no,int &ps){
	if(l>pos||T[no]==0){
		ps=0;return 0;
	}if(r<=pos){
		ps=P[no];return T[no];
	}
	int mid=(l+r)>>1,x,y;
	int ret1=find(l,mid,no*2,x);
	int ret2=find(mid+1,r,no*2+1,y);
	
	if(x==0)ps=y;
	else if(y==0)ps=x;
	else ps=(ret1>=ret2?x:y);
	return max(ret1,ret2);
}

string str(string s,int cnt){
	string ret="";
	for(int i=1;i<=cnt;i++)ret=ret+s;
	return ret;
}

int main()
{
	cin>>h>>w>>n;
	for(int i=1;i<=n;i++)cin>>coin[i].x>>coin[i].y;
	sort(coin+1,coin+n+1,cmp);
	coin[0].x=coin[0].y=1;
	for(int i=1;i<=n;i++){
		num=i;
		pos=coin[i].y;
		int cc;
		val=f[i]=find(1,w,1,cc)+1;
		add(1,w,1);
		op[i]=cc;
	}
	for(int i=1;i<=n;i++)
		if(maxn<f[i])maxn=f[i],ans=i;
	cout<<f[ans]<<endl;
	output=str("D",h-coin[ans].x)+str("R",w-coin[ans].y)+output;
	while(ans){
		output=str("D",coin[ans].x-coin[op[ans]].x)+str("R",coin[ans].y-coin[op[ans]].y)+output;
		ans=op[ans];
	}
	cout<<output<<endl;
	return 0;
}

2024/9/5 21:15
加载中...