先判断无解情况。
显然,每一步无论怎么走都会使奇偶性发生相同的改变,因此当 \(\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;
}
标签:ab,return,ABC111D,int,ll,GetC,Robot,Arms,sgn
From: https://www.cnblogs.com/pref-ctrl27/p/17143173.html