题目链接:B题链接


题目大意:走路收集背包,只能向右和向左走,如果不能全部收集则输出NO,否则则输出YES,并且路径要满足最短,且字典序最小。

解题思路:直走别瞎拐,排序,先走到力原点近的,会导致左拐的地和向下的点全部会导致NO,所以再进行下判断。

const int N = 10000;
struct p{
    int x; int y;
}a[N];
bool cmp(struct p a, struct p b){
    return a.x*a.x+a.y*a.y < b.x*b.x+b.y*b.y;
}
int main(){
    int t; RD(t);
    while(t--){
        LL n; RD(n);
        for(int i = 0; i < n; i++){
            int xx, yy;
            cin >> xx >> yy;
            a[i].x = xx;
            a[i].y = yy;
        }
        bool flag = true;
        sort(a, a+n, cmp);
        string ans = "";
        for(int j = 0; j < a[0].x; j++) ans+="R";
        for(int j = 0; j < a[0].y; j++) ans+="U";
        for(int i = 1; i < n; i++){
                if(a[i].x < a[i-1].x || a[i].y < a[i-1].y)
                {
                    flag =false;
                    break;
                }
            for(int j = a[i-1].x; j < a[i].x; j++) ans+="R";
            for(int j = a[i-1].y; j < a[i].y; j++) ans+="U";
        }
        if (flag){
            cout << "YES\n" << ans << '\n';
        }
        else {
            cout << "NO\n";
        }
    }
}