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