結果
| 問題 |
No.1315 渦巻洞穴
|
| コンテスト | |
| ユーザー |
りあん
|
| 提出日時 | 2020-11-27 01:10:22 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,740 bytes |
| コンパイル時間 | 30,428 ms |
| コンパイル使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2025-01-16 05:57:49 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
コンパイルが30秒の制限時間を超えました
ソースコード
#include <bits/stdc++.h>
#include "testlib.h"
// #include "constraints.hpp"
using namespace std;
const long long MIN_ST = 1;
const long long MAX_ST = 1000000000;
const int MIN_K = 1;
const int MAX_K = 200000;
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(int argc, char** argv) {
registerValidation(argc, argv);
long long S = inf.readLong(MIN_ST, MAX_ST, "S");
inf.readSpace();
long long T = inf.readLong(MIN_ST, MAX_ST, "T");
ensure(S != T);
inf.readEoln();
inf.readEof();
string ans = solve(S, T);
cout << "0\n" << ans.length() << '\n' << ans << '\n';
return 0;
}
りあん