题目大意:平面上有$n$个点,要求你构造$m$条边(满足$m\leqslant40$),使得可以从原点到达给定的$n$个点(边必须平行于坐标轴)。并要求输出每一条边的方向,每条边必须都使用,无解输出$-1$。$n\leqslant1000$,点的坐标的绝对值$\leqslant10^9$,边长度$\leqslant10^{12}$

题解:因为所有的边必须使用,所以每一个点横纵坐标相加的奇偶性相同,不同就无解。发现若构造长度为$1,2,\cdots,2^n$的边,可以到达满足$|x|+|y|\leqslant2^{k+1}-1$且$|x|+|y|\equiv 1\pmod2$的所有点,若$|x|+|y|\equiv0\pmod2$就再加一条长度为$1$的边。并且发现$2^n>\sum\limits_{i=0}^{n-1}2^i$,故若从大到小考虑边,一定走横纵坐标中相差较多的一个方向。这样贪心枚举即可。

卡点:没开$\mathrm{long\ long}$,没有修改坐标位置

C++ Code:

#include <iostream>
#include <algorithm>
#include <cstdio>
const int maxn = 1010,
X[] = { 1, 0, -1, 0 }, Y[] = { 0, 1, 0, -1 }; int n, x[maxn], y[maxn], w[maxn], idx;
void solve(long long x, long long y) {
for (int i = 1; i <= idx; ++i) {
char c;
if (abs(x) > abs(y))
if (x < 0) x += w[i], c = 'L';
else x -= w[i], c = 'R';
else
if (y < 0) y += w[i], c = 'D';
else y -= w[i], c = 'U';
std::cout << c;
}
std::cout.put('\n');
} int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n;
for (int i = 1; i <= n; ++i) {
std::cin >> x[i] >> y[i];
if ((x[i] + y[i] & 1) != (x[1] + y[1] & 1)) {
std::cout << "-1\n";
return 0;
}
}
for (int i = 30; ~i; --i) w[++idx] = 1 << i;
if (!(x[1] + y[1] & 1)) w[++idx] = 1;
std::cout << idx << '\n';
for (int i = 1; i < idx; ++i) std::cout << w[i] << ' ';
std::cout << w[idx] << '\n';
for (int i = 1; i <= n; ++i) solve(x[i], y[i]);
return 0;
}

  

[Atcoder ARC103D]Robot Arms的更多相关文章

  1. AtCoder Regular Contest 103 Problem D Robot Arms (构造)

    题目链接  Problem D 给定$n$个坐标,然后让你构造一个长度为$m$的序列, 然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向, 每次从原点出发按照这个序列方向,每 ...

  2. Robot Arms AtCoder - 4432 (构造)

    大意: 给定平面上$n$个点$(x_i,y_i)$. 要求构造一个序列$d$, $d_i$表示每步走的距离, 再构造$n$个命令串, 要求从原点出发按照第$i$个命令走, 走完恰好到达$(x_i,y_ ...

  3. 「ARC103D」Robot Arms「构造」

    题意 给定\(n\)个点,你需要找到一个合适的\(m\)和\(d_1,d_2,...,d_m\),使得从原点出发每次向四个方向的某一个走\(d_i\)个单位,最终到达\((x_t, y_t)\).输出 ...

  4. [atARC103D]Robot Arms

    合法的必要条件是每个点两维坐标和奇偶性相同,同时这也是充分条件 令$d_{i}=\{2^{0},2^{1},...,2^{m-1}\}$,归纳其可以走到任意满足$|x|+|y|<2^{m}$的$ ...

  5. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  6. 【AtCoder】ARC103

    C - //// 为了防止一些多余的判断,我选择直接记录每个数的个数,然后枚举第一个数,找第一个数之外第二个数改变最少的情况下应该选什么 代码 #include <bits/stdc++.h&g ...

  7. AtCoder | ARC103 | 瞎讲报告

    目录 ARC 103 A.//// B.Robot Arms C.Tr/ee D.Distance Sums ARC 103 窝是传送门QwQ A.//// 题意 : 给你\(n\)(\(n\)为偶数 ...

  8. AtCoder Regular Contest 103

    传送门 C - /\/\/\/ 题意: 给出一个序列\(\{a_i\}\),先要求其满足以下条件: \(a_i=a_{i+2}\) 共有两个不同的数 你现在可以修改任意个数,现问最少修改个数为多少. ...

  9. 2293: Distribution Center 中南多校

    Description The factory of the Impractically Complicated Products Corporation has many manufacturing ...

随机推荐

  1. notepad++ 设置运行python脚本

    按F5 在输入框中输入: cmd /k python “$(FULL_CURRENT_PATH)” &PAUSE & EXIT python路径必须在环境变量中. 否则需要输入完整的p ...

  2. 5.如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?

    作者:中华石杉 面试题 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis ...

  3. Java枚举的用法和原理深入

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10843644.html 一:枚举的用法 1.定义和组织常量 在JDK1.5之前,我们定义常量都是:publi ...

  4. Python:日常应用汇总

    判断路径中是否包含中文 import re def IsContainChinese(path:str) -> bool : cnPatter=re.compile(u'[\u4e00-\u9f ...

  5. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美

    题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...

  6. Django常用自段和参数

    本文目录 1 ORM字段 2 ORM字段参数 3 关系字段 4 多对多关联关系的三种方式 5 元信息 6 自定义字段(了解) 回到目录 1 ORM字段 AutoField int自增列,必须填入参数 ...

  7. Python 文件读写操作实例详解

    Python提供了必要的函数和方法进行默认情况下的文件基本操作.你可以用file对象做大部分的文件操作 一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前 ...

  8. 使用Python3进行AES加密和解密 输入的数据

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  9. web标准以及w3c标准

    web标准:将结构.表现.行为分离,使其更具有模块化. w3c标准:标签字母要小写,双标签要闭合,标签不允许随意嵌套. 尽量使用外部样式和外链js,使结构.表现.行为分为三块,这样可以提高页面渲染速度 ...

  10. netlify搭建静态站+https

    转载[大雄的学习人生 - 原文地址:https://www.cnblogs.com/codernie/p/9062104.html] 一.使用github或者gitlab登陆netlify 首先,打开 ...