树套树求卡常
查看原帖
树套树求卡常
554803
After_light楼主2024/9/3 19:46

bit 套 sgt

#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
#define R(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=2e7+7;
int n,m,k,cnt,rt[N],idx,las[N],ans[N],tot;
struct edge{
	int r,c,b,id;
	edge(int _r=0,int _c=0,int _b=0){
		r=_r,c=_c,b=_b;
	}
	bool operator<(const edge& x)const{
		if(r==x.r){
			if(c==x.c){
				return b<x.b;
			}
			return c<x.c;
		}
		return r<x.r;
	}
}s[N];
struct SGT{
	int l,r,val,id;
}t[N];
inline int lowbit(int x){
	return x&(-x);
}
inline void pushup(int now){
	(t[t[now].l].val>t[t[now].r].val)?t[now].val=t[t[now].l].val:t[now].val=t[t[now].r].val;
	(t[t[now].l].val>t[t[now].r].val)?t[now].id=t[t[now].l].id:t[now].id=t[t[now].r].id;
}
inline void update(int &now,int now_l,int now_r,int l,int r,int val,int id){
	if(!now) now=++idx;
	if(now_l==now_r){
		t[now].val=val;
		t[now].id=id;
		return ;
	}
	int mid=(now_l+now_r)>>1;
	if(l<=mid) update(t[now].l,now_l,mid,l,r,val,id);
	if(r>mid) update(t[now].r,mid+1,now_r,l,r,val,id);
	pushup(now);
}
inline void add(int x,int y,int c,int id){
	while(x<=n){
		update(rt[x],0,m,y,y,c,id);
		x+=lowbit(x);
	}
}
inline pair<int,int> query_mx(int &now,int now_l,int now_r,int l,int r){
	if(!now) now=++idx;
	if(l<=now_l&&r>=now_r){
		return make_pair(t[now].val,t[now].id);
	}
	int mid=(now_l+now_r)>>1;
	pair<int,int> ans,k;
	ans=make_pair(0,0);
	k=make_pair(0,0);
	if(l<=mid){
		k=query_mx(t[now].l,now_l,mid,l,r);
		if(k.first>ans.first){
			ans=k;
		}
	}
	if(r>mid){
		k=query_mx(t[now].r,mid+1,now_r,l,r);
		if(k.first>ans.first){
			ans=k;
		}
	}
	pushup(now);
	return ans;
}
inline pair<int,int> query(int x,int y){
	pair<int,int> sum=make_pair(0,0);
	while(x){
		pair<int,int> k=query_mx(rt[x],0,m,0,y);
		if(sum.first<k.first){
			sum=k;
		}
		x-=lowbit(x);
	}
	return sum;
} 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>k;
	F(i,1,k){
		cin>>s[i].r>>s[i].c;
		s[i].b=1;
	}
	cnt=k;
	s[++cnt]=edge(1,1,0);
	s[++cnt]=edge(n,m,0);
	sort(s+1,s+cnt+1);
	F(i,1,cnt){
		pair<int,int> pk,pk2;
		pk=query(s[i].r-1,s[i].c);
		pk2=query(s[i].r,s[i].c-1);
		if(pk.first<pk2.first){
			pk=pk2;
		}
		las[i]=pk.second;
		add(s[i].r,s[i].c,pk.first+s[i].b,i);
	}
	cout<<query(n,m).first<<"\n";
	int now=cnt;
	ans[++tot]=now;
	while(now!=0){
		now=las[now];
		if(!now)  break;
		ans[++tot]=now;
	} 
	reverse(ans+1,ans+tot+1);
	s[0].r=s[0].c=1;
	F(i,1,tot){
		for(int j=1;j<=s[ans[i]].r-s[ans[i-1]].r;j++){
			cout<<"D";
		}
		for(int j=1;j<=s[ans[i]].c-s[ans[i-1]].c;j++){
			cout<<"R";
		}
	}
	return 0;
}

2024/9/3 19:46
加载中...