問題の意味
与えられた\(N \)ポイント、あなたは、適切な見つける必要がある\(m個\)と\(D_1、D_2、...、D_m \)をそれぞれが4つの方向に行くために、原点から始まるように、\(D_I \)単位、最終的に到達\((X_T、Y_t)を\) 。出力\(Mの\)と\(D \)アレイとするための\(T = 1 \ n個の \) 出力方向。
\(N- \ 1当量3 ^ 10 \) 、レンジ座標\を(10 ^ 9 \)
問題の解決策
もしポイント\((X_T、Y_t)\)、\ (X_T + Y_t \)がないソリューション、異なるパリティの
場合\は(X_T + y_t \)でもあり、私たちみましょう\(D_1。1 = \) 、これに変換\(X_T + y_t \)が奇数です。
行うにはどのように奇妙な?バイナリ構造。
:検討\(D(K)= { 1、2、4、...、2 ^ K} \) そのようなセットは、すべて行くことができる| X | + | Y \( | \当量2 ^ {kは-1 + 1} \)点(奇数)
証明:https://blog.csdn.net/qq_37555704/article/details/83217444#_14ここでは、マップを移動しました。
ため\(D(K) - D (K-1)\) 領域(新しいゾーン)、(紫赤色以上)ステップに直接行きます
元の領域に到達することができ、私たちは内側から内側に行くことができます。
二:解決策を見つける方法を考えてみましょう。
証明:\(D(K)が\)ポイント満足に来ることができる\(\分(| X | 、| Y |)\当量2 ^ K-1 \)
おそらく値証明(| = 2 ^ K \ \ X | = 2 ^ K-1、| | y)を調整好ましくない見出さに運ば。
限り、我々から各として\(D(k)は\)行き(D(K-1)\を \) するために、することができ(D(0)\)\成功するとき
分析を描くことによって、大きな絶対値の各々は、より小さくすることができる\(D(K)\)来る\(D(1-K)を\) 。
その後、問題がなくなっています。私たちの上にあります\(D(k)は\)行ってきました\(\ dは(K-1))は、実際に他の方法で回避され、その文字の出力が否定さに注意を払います。
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1010;
int n, m, x[N], y[N], d[N];
bool tg[N];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) {
scanf("%d%d", x + i, y + i);
tg[(x[i] + y[i]) & 1] = 1;
}
if(tg[0] & tg[1]) return puts("-1") & 0;
if(tg[0]) d[++ m] = 1;
for(int i = 30; ~ i; i --) d[++ m] = 1 << i;
printf("%d\n", m);
for(int i = 1; i <= m; i ++) printf("%d%c", d[i], " \n"[i == m]);
for(int i = 1; i <= n; i ++, putchar('\n')) {
for(int j = 1; j <= m; j ++) {
if(abs(x[i]) > abs(y[i])) {
if(x[i] > 0) x[i] -= d[j], putchar('R');
else x[i] += d[j], putchar('L');
} else {
if(y[i] > 0) y[i] -= d[j], putchar('U');
else y[i] += d[j], putchar('D');
}
}
}
return 0;
}