[ABC111D] Robot Arms

\(\mathcal Link\)

先判断无解情况。

显然,每一步无论怎么走都会使奇偶性发生相同的改变,因此当 \(\exists i,j\) 使得 \(x_i+y_i\not\equiv x_j+y_j\pmod 2\) 时无解。

考虑构造 \(c_i\),容易想到倍增构造 \(1,2,4,8,\cdots ,2^k\)

接下来证明该序列能构造所有 \(|x|+|y|\leq 2^{k+1}-1\)\(x+y\equiv 1\pmod 2\) 的坐标。

\(k=0\) 时显然成立。
\(k>0\) 时,考虑令 \(|x|\geq |y|\),则将 \(2^k\) 放入 \(x\)方向,此时 \(|x'|+|y|=|y|+||x|-2^k|\)

  • \(|x|<2^k\) 时结果为 \(|y|+2^k-|x|\leq 2^k\),由于 \(|x|\not=|y|\),所以 \(|x'|+|y|<2^k\)
  • \(|x|>2^k\) 时结果为 \(|x|+|y|-2^k\leq 2^k-1\)

对于偶数,再加上 \(1\) 的偏移量。

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;

using ll=long long;

char buf[1<<14], *p1=buf, *p2=buf;
#define GetC() ((p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<14,stdin),p1==p2)?EOF:*p1++)

struct Ios{}io;
template <typename _tp>
Ios &operator >>(Ios &in, _tp &x){
    x=0; int w=0; char c=GetC();
    for(;!isdigit(c);w|=c=='-', c=GetC());
    for(;isdigit(c);x=x*10+(c^'0'), c=GetC());
    if(w) x=-x;
    return in;
}
const int N=1005;

ll x[N], y[N];

auto ab=[](ll x)->ll{ return x>=0?x:-x; };
auto sgn=[](ll x)->ll{ return  x>=0?0:1; };

const char *s="RLUD";

int main(){
    int n; io>>n;
    int r=0;
    for(int i=1;i<=n;++i){
        io>>x[i]>>y[i];
        if(i==1) r=ab(x[i]+y[i])%2;
        else if(r!=ab(x[i]+y[i])%2) {
            puts("-1");
            return 0;
        }
    }
    printf("%d\n", 33+(!r));
    for(int i=32;~i;--i)
        printf("%lld ",1ll<<i);
    if(!r) printf("1 ");
    puts("");
    for(int i=1;i<=n;++i){
        for(int k=32;~k;--k){
            if(ab(x[i])>ab(y[i])){
                putchar(s[sgn(x[i])]);
                x[i]=x[i]+(sgn(x[i])*2-1)*(1ll<<k);
            }
            else{
                putchar(s[2+sgn(y[i])]);
                y[i]=y[i]+(sgn(y[i])*2-1)*(1ll<<k);
            }
        }
        if(!r){
            if(ab(x[i])>ab(y[i]))
                putchar(s[sgn(x[i])]);
            else
                putchar(s[2+sgn(y[i])]);
        }
        puts("");
    }
    return 0;
}
posted @ 2023-02-22 09:14  pref_ctrl27  阅读(21)  评论(0编辑  收藏  举报