結果
| 問題 |
No.1315 渦巻洞穴
|
| コンテスト | |
| ユーザー |
りあん
|
| 提出日時 | 2020-11-27 01:04:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,423 bytes |
| コンパイル時間 | 2,157 ms |
| コンパイル使用メモリ | 196,604 KB |
| 最終ジャッジ日時 | 2025-01-16 05:56:15 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 79 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using P = pair<long long, long long>;
// O(sqrt(x))
P to_ij(long long x) {
static const int dx[] = { 1, 0, -1, 0 };
static const int dy[] = { 0, 1, 0, -1 };
int k = 0;
long long p = 1;
long long d = 1;
P pos(0, 0);
while (p < x) {
for (int i = 0; i < 2; ++i) {
long long s = min(d, x - p);
p += s;
pos.first += s * dx[k + i];
pos.second += s * dy[k + i];
}
k ^= 2;
++d;
}
return pos;
}
// O(1)
long long to_x(long long i, long long j) {
long long k = max(abs(i), abs(j));
long long s = k * 2 + 1;
if (j == -k) {
return s * s - (s - 1) * 0 - (k - i);
}
else if (i == -k) {
return s * s - (s - 1) * 1 - (k + j);
}
else if (j == k) {
return s * s - (s - 1) * 2 - (k + i);
}
else {
return s * s - (s - 1) * 3 - (k - j);
}
}
long long to_x(const P& p) {
return to_x(p.first, p.second);
}
// (command, xor)
// xor: except from value
pair<string, long long> get_move(const P& from, const P& to) {
P p = from;
string command = "";
long long x = 0;
// RUDL
while (p.first < to.first) {
++p.first;
command += "R";
x ^= to_x(p);
}
while (p.second < to.second) {
++p.second;
command += "U";
x ^= to_x(p);
}
while (p.second > to.second) {
--p.second;
command += "D";
x ^= to_x(p);
}
while (p.first > to.first) {
--p.first;
command += "L";
x ^= to_x(p);
}
return { command, x };
}
string solve(const P& s, const P& t) {
long long x = get_move(s, t).second;
string ans = "";
if (x != 0) {
ans += get_move(s, to_ij(x)).first;
ans += get_move(to_ij(x), s).first;
ans += get_move(s, t).first;
}
else {
x = get_move(t, s).second;
assert(x != 0);
ans += get_move(s, t).first;
ans += get_move(t, to_ij(x)).first;
ans += get_move(to_ij(x), t).first;
}
return ans;
}
string solve(long long s, long long t) {
return solve(to_ij(s), to_ij(t));
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
long long s, t;
cin >> s >> t;
string ans = solve(s, t);
cout << "0\n" << ans.length() << '\n' << ans + "LR" << '\n';
return 0;
}
りあん