码迷,mamicode.com
首页 > 其他好文 > 详细

Atcoder Regular Contest 103D Robot Arms

时间:2018-12-13 13:47:55      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:void   struct   memset   http   ret   ioi   file   std   模拟   

题意

  • 在一个坐标系中有\(n\)个点,你每次从原点出发走\(m\)步,\(m <= 40\),每一次走的每一步步长需要相同,构造一种走法。

把每个坐标拆成二进制位,先不管正负,例如\(27 = 0000000000000000000000000011011_2\),我们从高到低删二进制位,如果这个数存在某一位,那么直接删掉就好了,不然就把除了最后一位之外全部取反。

当然我们优先删\(x, y\)中绝对值大的,因为删绝对值大的剩下的那个数就一定更小,那么这样我们可以保证\(x, y\)都能被删到\(0\),如果不能理解的话手动模拟下就好了。

Codes

#include<bits/stdc++.h>
#include<bits/extc++.h>
 
#define file(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
#define go(x, i) for(register int i = head[x]; i; i = nxt[i])
#define For(i, a, b) for(register int i = (a), i##_end_ = (b); i <= i##_end_; ++ i)
#define FOR(i, a, b) for(register int i = (a), i##_end_ = (b); i >= i##_end_; -- i)
#define debug(x) cout << #x << " = " << x << endl
#define mem(a, b) memset(a, b, sizeof(a))
#define cpy(a, b) memcpy(a, b, sizeof(a))
#define min(a, b) (a < b ? a : b)
#define max(a, b) (b < a ? a : b)
#define inf (0x3f3f3f3f)
#define INF (1e18)
#define pb push_back
#define mp make_pair
#define x first
#define y second
 
typedef unsigned long long ull;
typedef unsigned int uint;
typedef long long ll;
typedef std::pair<ll, int> PLI;
typedef std::pair<int, int> PII;
typedef long double ldb;
typedef double db;
 
using namespace std;
const int N = 1e3 + 10;
 
int n, m, d[N];
 
struct Point {
    int x, y;
}A[N];
 
void Solve(int x, int y) {
    FOR(i, 30, 0) {
        int now = 1 << i;
        if(abs(x) >= now) {
            if(x > 0) x -= now, putchar('R');
            else x += now, putchar('L');
        }
        else if(abs(y) >= now) {
            if(y > 0) y -= now, putchar('U');
            else y += now, putchar('D');
        }
        else {
            if(abs(x) > abs(y)) {
                if(x < 0) x += now, putchar('L');
                else x -= now, putchar('R');
            }
            else {
                if(y < 0) y += now, putchar('D');
                else y -= now, putchar('U');
            }
        }
    }
    if(x != 0 || y != 0) puts("fuck");
}
 
int main() {
#ifdef ylsakioi
    file("d");
#endif
    cin >> n; For(i, 1, n) cin >> A[i].x >> A[i].y;
    int flag = abs(A[1].x + A[1].y) & 1;
    For(i, 2, n) if((abs(A[i].x + A[i].y) & 1) ^ flag) return puts("-1"), 0;
    cout << (32 - flag) << endl;
    FOR(i, 30, 0) cout << (1 << i) << ' ';
    puts(flag ? "" : "1");
    if(!flag) For(i, 1, n) ++ A[i].y;
    For(i, 1, n) {
        Solve(A[i].x, A[i].y); 
        puts(flag ? "" : "D");
    }
    return 0;
}

Atcoder Regular Contest 103D Robot Arms

标签:void   struct   memset   http   ret   ioi   file   std   模拟   

原文地址:https://www.cnblogs.com/brunch/p/10113428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!