結果
| 問題 |
No.1315 渦巻洞穴
|
| コンテスト | |
| ユーザー |
りあん
|
| 提出日時 | 2020-12-11 01:15:32 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 5 ms / 2,000 ms |
| コード長 | 2,897 bytes |
| コンパイル時間 | 2,479 ms |
| コンパイル使用メモリ | 195,884 KB |
| 最終ジャッジ日時 | 2025-01-16 22:00:05 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 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);
}
string get_move(const P& s, const P& t) {
P p = s;
string ans = "";
while (p != t) {
if (p.first + 1 <= t.first) {
ans += "RLR";
++p.first;
}
else if (p.first - 1 >= t.first) {
ans += "LRL";
--p.first;
}
else if (p.second + 1 <= t.second) {
ans += "UDU";
++p.second;
}
else if (p.second - 1 >= t.second) {
ans += "DUD";
--p.second;
}
else {
assert(false);
}
if (p.first + 1 <= t.first) {
ans += "R";
++p.first;
}
else if (p.first - 1 >= t.first) {
ans += "L";
--p.first;
}
else if (p.second + 1 <= t.second) {
ans += "U";
++p.second;
}
else if (p.second - 1 >= t.second) {
ans += "D";
--p.second;
}
else {
assert(p == t);
}
}
return ans;
}
string solve(long long s, long long t) {
if (s % 2 != t % 2) {
return get_move(to_ij(s), to_ij(t));
}
else {
if (s % 2 == 1) {
string ans = "";
ans += get_move(to_ij(s), to_ij(4));
ans += "DRUL";
ans += get_move(to_ij(4), to_ij(t));
return ans;
}
else {
string ans = "";
ans += get_move(to_ij(s), to_ij(1));
ans += "RULDUD";
ans += get_move(to_ij(1), to_ij(t));
return ans;
}
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
long long s, t;
cin >> s >> t;
string ans = solve(s, t);
while (ans.length() + 4 <= 200001) {
ans += "LRLR";
}
cout << "0\n" << ans.length() << '\n' << ans << '\n';
return 0;
}
りあん