提出 #61871285
ソースコード 拡げる
namespace atcoder {}
#ifdef LOCAL
#define dbg(x) cerr << __LINE__ << " : " << #x << " = " << (x) << endl;
#else
#define NDEBUG
#define dbg(x) true;
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#endif
#ifdef GTEST
#include <gtest/gtest.h>
#endif
#include <math.h>
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#ifdef PERF
#include <gperftools/profiler.h>
#endif
using namespace std;
using namespace atcoder;
#define fast_io \
ios_base::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define ll long long int
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define reps(i, n) for (int i = 1; i <= (int)(n); i++)
#define REP(i, n) for (int i = n - 1; i >= 0; i--)
#define REPS(i, n) for (int i = n; i > 0; i--)
#define MOD (long long int)(1e9 + 7)
#define INF (int)(1e9)
#define LINF (long long int)(1e18)
#define all(v) v.begin(), v.end()
typedef pair<int, int> Pii;
typedef pair<ll, ll> Pll;
const double PI = acos(-1);
#ifdef NDEBUG
#define CHECK(v1, op, v2)
#else
#define CHECK(v1, op, v2) \
if (!((v1)op(v2))) { \
cerr << "ERROR:" << (v1) << " " << (v2) << endl; \
assert((v1)op(v2)); \
}
#endif
long double nCr(const int n, const int r) {
long double ret = 1;
rep(t, r) {
ret *= (n - t);
ret /= (r - t);
}
return ret;
}
template <typename T>
string to_string(const vector<T>& vec) {
string ret = "";
rep(i, vec.size()) {
ret += vec[i].to_string();
if (i + 1 != vec.size()) {
ret += ",";
}
}
return ret;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& vec) {
os << to_string(vec);
return os;
}
uint32_t xorshift() {
static uint32_t x = 12345789;
static uint32_t y = 362436069;
static uint32_t z = 521288629;
static uint32_t w = 78675123;
uint32_t t;
t = x ^ (x << 11);
x = y;
y = z;
z = w;
w ^= t ^ (t >> 8) ^ (w >> 19);
return w;
}
int rand(const int l, const int r) {
return xorshift() % (r - l) + l;
}
int rand_other_than(const int l, const int r,
const int other) {
const int num = rand(l, r - 1);
return num + (num >= other);
}
template <typename T>
const T& rand_vec(const vector<T>& vec) {
assert(vec.size() > 0);
return vec[rand(0, vec.size())];
}
template <typename T>
void shuffle(vector<T>& vec) {
rep(l, (int)vec.size() - 1) {
const int idx = rand(l, vec.size());
swap(vec[idx], vec[l]);
}
}
template <class T, class U = T>
bool chmin(T& x, U&& y) {
return y < x && (x = std::forward<U>(y), true);
}
template <class T, class U = T>
bool chmax(T& x, U&& y) {
return x < y && (x = std::forward<U>(y), true);
}
template <typename Ret, typename T>
Ret Sum(const vector<T>& vec) {
return std::accumulate(all(vec), (Ret)0);
}
template <typename Ret, typename T>
Ret Mean(const vector<T>& vec) {
assert((int)vec.size() > 0);
return Sum<T, Ret>(vec) / vec.size();
}
template <typename Ret, typename T>
Ret Std(const vector<T>& vec) {
assert((int)vec.size() > 0);
const auto mean = Mean<Ret>(vec);
const auto sum2 = std::accumulate(
all(vec), (Ret)0,
[](const Ret acc, const T val) { return acc + (Ret)val * val; });
return (Ret)sum2 / vec.size() - mean * mean;
}
template<typename T, typename U>
T Ceil(const T a, const U b){
assert(a >= 0);
assert(b > 0);
return (a + b - 1) / b;
}
template<typename T, typename U>
T Mod(const T a, const U b){
return (a + b) % b;
}
class Timer {
chrono::system_clock::time_point _start, _end;
ll _sum = 0, _count = 0;
public:
void start() { _start = chrono::system_clock::now(); }
void stop() { _end = chrono::system_clock::now(); }
void add() {
const chrono::system_clock::time_point now = chrono::system_clock::now();
_sum += static_cast<double>(
chrono::duration_cast<chrono::nanoseconds>(now - _start).count());
_count++;
}
ll sum() const { return _sum / 1000; }
int count() const { return _count; }
string average() const {
if (_count == 0) {
return "NaN";
}
return to_string(_sum / 1000 / _count);
}
void reset() {
_start = chrono::system_clock::now();
_sum = 0;
_count = 0;
}
inline int ms() const {
const chrono::system_clock::time_point now = chrono::system_clock::now();
return static_cast<double>(
chrono::duration_cast<chrono::microseconds>(now - _start).count() /
1000);
}
inline int ns() const {
const chrono::system_clock::time_point now = chrono::system_clock::now();
return static_cast<double>(
chrono::duration_cast<chrono::microseconds>(now - _start).count());
}
};
#ifdef LOCAL
struct Timers : unordered_map<string, Timer> {
friend ostream& operator<<(ostream& os, const Timers& timers) {
for (const auto& pa : timers) {
os << pa.first << " time: " << pa.second.sum() / 1000
<< " count: " << pa.second.count() << endl;
}
return os;
}
};
#else
struct Timers {
struct Dummy {
void start() const {}
void add() const {}
};
Dummy dummy;
const Dummy& operator[](const std::string& str) { return dummy; }
friend ostream& operator<<(ostream& os, const Timers& timers) { return os; }
};
#endif
Timers global_timers;
/* start */
Timer global_timer;
struct Pos {
int x, y;
};
int N, M, H;
vector<int> A;
// 大きい順
vector<int> sortdAIdxes;
vector<vector<int>> G;
vector<Pos> Ps;
vector<vector<int>> triangleNodes;
struct Output {
static void StaticInit(istream &is) {
global_timer.start();
is >> N >> M >> H;
rep(i, N) {
int a;
is >> a;
A.push_back(a);
}
sortdAIdxes.resize(N);
iota(all(sortdAIdxes), 0);
sort(all(sortdAIdxes), [&](int i, int j) { return A[i] > A[j]; });
G.resize(N);
rep(i, M) {
int u, v;
is >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
rep(i, N) {
int x, y;
is >> x >> y;
Ps.push_back({x, y});
}
// 三角形の頂点
rep(i, N){
for(const auto adj : G[i]){
for(const auto adj2 : G[adj]){
if(adj2 == i) continue;
bool isTriangle = false;
for(const auto adj3 : G[adj2]){
if(adj3 == i){
isTriangle = true;
break;
}
}
if(!isTriangle) continue;
if(min({i, adj, adj2}) != i) continue;
vector<int> sortedNodes = {i, adj, adj2};
sort(all(sortedNodes));
triangleNodes.push_back(sortedNodes);
}
}
}
cerr << triangleNodes.size() << endl;
}
friend ostream &operator<<(ostream &os, const Output &output) { return os; }
};
/* start */
vector<double> PARAMS = {4e2, 2e1};
/* start */
// NBD = neighborhood
template <class Solution, class NBDGenerator>
struct SimulatedAnnealing {
public:
SimulatedAnnealing(double end_time, double start_temp, double end_temp)
: end_time_(end_time * 1000), // ns
inv_time_(1.0 / end_time_),
cur_time_(0.0),
start_temp_(start_temp),
end_temp_(end_temp),
diff_temp_(end_temp_ / start_temp_),
cur_temp_(start_temp) {
assert(start_temp >= end_temp);
timer_.start();
}
Solution run(const Solution& initial_sol, NBDGenerator& nbd_generator) {
Solution sol(initial_sol);
int acc = 0;
int g = 0;
for (;; ++g) {
if ((g & 0xfff) == 0) {
#ifdef SA_MAX_G
if (g >= SA_MAX_G) {
break;
}
#endif
UpdateTime();
UpdateTemp();
if (cur_time_ > end_time_) {
break;
}
}
const auto nbd = nbd_generator.Generate(&sol, g, cur_time_ * inv_time_);
constexpr int mod = 1'000'000'000;
const int r = rand(0, mod);
if (static_cast<double>(r) / mod < exp(-nbd->Diff() / cur_temp_)) {
acc++;
nbd->Update(&sol);
} else {
nbd->Restore(&sol);
}
}
cerr << "g,acc: " << g << " " << acc << endl;
return sol;
}
private:
double end_time_, inv_time_, cur_time_;
double start_temp_, end_temp_, diff_temp_, cur_temp_;
Timer timer_;
void UpdateTime() { cur_time_ = timer_.ns(); }
void UpdateTemp() {
cur_temp_ = start_temp_ * pow(diff_temp_, cur_time_ * inv_time_);
// cur_temp_ = max(0.0, start_temp_ - cur_time_ * diff_temp_ * inv_time_);
}
};
#include <iostream>
/*
実装手順
0. Output::StaticInit(istream&)を実装
1. Solutionの初期解生成を書く
2. Solutionに対する操作とEvalの更新を書く
3. Evalの初期値計算を書く
4. Eval::Sum()とSolution::Score()を書く
5. 近傍操作と復元操作を書く
6. 近傍の各確率を調整
*/
struct Evaluation {
int realScore = 1;
int invalidCount = 0;
// 最大化問題の場合は符号を反転すること
double Sum() const { return -realScore + invalidCount * 1e9; }
};
struct Solution {
Evaluation eval;
vector<int> hs;
vector<int> parentAdjCounts;
Solution() : hs(N, 0), parentAdjCounts(N, 0) { InitEval(); }
void InitEval() {
eval = Evaluation();
parentAdjCounts = vector<int>(N, 0);
rep(i, N) {
eval.realScore += (hs[i] + 1) * A[i];
// 隣接する、自分より1小さい数の個数
for (const auto adj : G[i]) {
if (hs[i] == hs[adj] + 1) {
parentAdjCounts[i]++;
}
}
if (hs[i] != 0 && parentAdjCounts[i] == 0) {
eval.invalidCount++;
}
}
}
static Solution CreateInitialSol() {
Solution sol;
// cerr << sol.Eval() << endl;
// Aが大きい順に貪欲に大きくしていく
// ほぼ意味ない
rep(t, H) {
rep(_i, N) {
const int idx = sortdAIdxes[_i];
if (sol.hs[idx] != t)
continue;
auto diff = -sol.Eval();
sol.ChangeHeight(idx, t + 1);
diff += sol.Eval();
if (diff > 0.0) {
// 復元
sol.ChangeHeight(idx, t);
}
}
}
// cerr << sol.Eval() << endl;
sol.InitEval();
return sol;
}
void ChangeHeight(const int idx, const int newH) {
if(hs[idx] == newH) return;
// 自分
if (hs[idx] != 0 && parentAdjCounts[idx] == 0) {
// invalidを解消
eval.invalidCount--;
}
parentAdjCounts[idx] = 0;
// 隣
for (const auto adj : G[idx]) {
if (hs[adj] == hs[idx] + 1) {
// 1つ減らす
parentAdjCounts[adj]--;
// invalidになった
if (hs[adj] != 0 && parentAdjCounts[adj] == 0)
eval.invalidCount++;
}
if (hs[adj] == newH + 1) {
// 1つ増やす
parentAdjCounts[adj]++;
// invalidではなくなった
if (hs[adj] != 0 && parentAdjCounts[adj] == 1)
eval.invalidCount--;
}
if (newH == hs[adj] + 1) {
// 自分
parentAdjCounts[idx]++;
}
}
eval.realScore += (newH - hs[idx]) * A[idx];
hs[idx] = newH;
// invalidになった
if (hs[idx] != 0 && parentAdjCounts[idx] == 0) {
eval.invalidCount++;
}
}
double Eval() const { return eval.Sum(); }
double Score() const { return -Eval(); }
friend ostream &operator<<(ostream &os, const Solution &sol) {
rep(i, N) {
// cerr << sol.hs[i] << " ";
if (i != 0)
os << " ";
if (sol.hs[i] == 0) {
os << "-1";
continue;
}
// cerr << i << " " << sol.hs[i];
for (const auto adj : G[i]) {
// cerr << " " << sol.hs[adj];
if (sol.hs[i] == sol.hs[adj] + 1) {
os << adj;
break;
}
}
// cerr << endl;
}
return os;
}
};
struct NBD {
double Diff() const { return diff; }
void Update(Solution *) const { return; };
virtual void Restore(Solution *) const = 0;
double diff;
};
// 隣+1にする
struct NBD1 : public NBD {
int idx;
int oldH;
int newH;
NBD1() {}
NBD1(Solution *const sol) {
diff = -sol->Eval();
while (true) {
idx = rand(0, N);
oldH = sol->hs[idx];
newH = rand(0, 100) < 90 ? sol->hs[rand_vec(G[idx])] + 1 : rand(0, 2) == 0 ? 0 : H;
if (oldH == newH)
continue;
if (newH > H)
continue;
sol->ChangeHeight(idx, newH);
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
sol->ChangeHeight(idx, oldH);
return;
}
};
// 1増減
struct NBD2 : public NBD {
int idx;
int oldH;
int newH;
NBD2() {}
NBD2(Solution *const sol) {
diff = -sol->Eval();
while (true) {
idx = rand(0, N);
oldH = sol->hs[idx];
newH = oldH == 0 ? 1
: oldH == H ? H - 1
: rand(0, 2) == 0 ? oldH + 1
: oldH - 1;
sol->ChangeHeight(idx, newH);
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override { sol->ChangeHeight(idx, oldH); }
};
// 隣接スワップ
struct NBD3 : public NBD {
int idx0;
int idx1;
int oldH0;
int oldH1;
NBD3() {}
NBD3(Solution *const sol) {
diff = -sol->Eval();
while (true) {
idx0 = rand(0, N);
oldH0 = sol->hs[idx0];
idx1 = rand_vec(G[idx0]);
oldH1 = sol->hs[idx1];
sol->ChangeHeight(idx0, oldH1);
sol->ChangeHeight(idx1, oldH0);
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
sol->ChangeHeight(idx0, oldH0);
sol->ChangeHeight(idx1, oldH1);
}
};
// 隣接増減
struct NBD4 : public NBD {
int idx0;
int idx1;
int oldH0;
int oldH1;
NBD4() {}
NBD4(Solution *const sol) {
diff = -sol->Eval();
while (true) {
idx0 = rand(0, N);
oldH0 = sol->hs[idx0];
idx1 = rand_vec(G[idx0]);
oldH1 = sol->hs[idx1];
if (oldH0 == oldH1)
continue;
if (abs(oldH0 - oldH1) >= 2)
continue;
const int hDiff = rand(0, 100) < 90 ? 1 : -1;
if (oldH0 + hDiff > H || oldH1 + hDiff > H)
continue;
if (oldH0 + hDiff < 0 || oldH1 + hDiff < 0)
continue;
sol->ChangeHeight(idx0, oldH0 + hDiff);
sol->ChangeHeight(idx1, oldH1 + hDiff);
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
sol->ChangeHeight(idx0, oldH0);
sol->ChangeHeight(idx1, oldH1);
}
};
// 隣接する自分+1を全て増加
struct NBD5 : public NBD {
vector<int> idxes;
vector<int> oldHs;
NBD5() {}
NBD5(Solution *const sol) {
diff = -sol->Eval();
while (true) {
idxes.clear();
oldHs.clear();
const int baseIdx = rand(0, N);
const int baseOldH = sol->hs[baseIdx];
if (baseOldH + 2 > H)
continue;
idxes.push_back(baseIdx);
oldHs.push_back(baseOldH);
for (const auto adj : G[baseIdx]) {
const int adjH = sol->hs[adj];
if (adjH == baseOldH + 1) {
idxes.push_back(adj);
oldHs.push_back(adjH);
}
}
rep(i, idxes.size()) { sol->ChangeHeight(idxes[i], oldHs[i] + 1); }
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
rep(i, idxes.size()) { sol->ChangeHeight(idxes[i], oldHs[i]); }
}
};
// 隣接ABについて、 A = B と B = rand()
struct NBD6 : public NBD {
int idx0;
int idx1;
int oldH0;
int oldH1;
NBD6() {}
NBD6(Solution *const sol) {
diff = -sol->Eval();
while (true) {
idx0 = rand(0, N);
oldH0 = sol->hs[idx0];
idx1 = rand_vec(G[idx0]);
oldH1 = sol->hs[idx1];
// A = B
const int newH0 = oldH1;
// B = rand()
const auto adjAdj = rand_vec(G[idx1]);
if (adjAdj == idx0)
continue;
const int newH1 = sol->hs[adjAdj] + 1;
if (newH1 > H)
continue;
sol->ChangeHeight(idx0, newH0);
sol->ChangeHeight(idx1, newH1);
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
sol->ChangeHeight(idx0, oldH0);
sol->ChangeHeight(idx1, oldH1);
}
};
// 三角形のローテーション
struct NBD7 : public NBD {
int idx0;
int idx1;
int idx2;
int oldH0;
int oldH1;
int oldH2;
NBD7() {}
NBD7(Solution *const sol) {
diff = -sol->Eval();
while (true) {
const int triangleIdx = rand(0, triangleNodes.size());
const auto &nodes = triangleNodes[triangleIdx];
idx0 = nodes[0];
idx1 = nodes[1];
idx2 = nodes[2];
oldH0 = sol->hs[idx0];
oldH1 = sol->hs[idx1];
oldH2 = sol->hs[idx2];
if (rand(0, 2) == 0) {
// 0 -> 1 -> 2
sol->ChangeHeight(idx0, oldH1);
sol->ChangeHeight(idx1, oldH2);
sol->ChangeHeight(idx2, oldH0);
} else {
// 0 -> 2 -> 1
sol->ChangeHeight(idx0, oldH2);
sol->ChangeHeight(idx1, oldH0);
sol->ChangeHeight(idx2, oldH1);
}
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
sol->ChangeHeight(idx0, oldH0);
sol->ChangeHeight(idx1, oldH1);
sol->ChangeHeight(idx2, oldH2);
}
};
// 三角形のうち2つをスワップ
struct NBD8 : public NBD {
int idx0;
int idx1;
int oldH0;
int oldH1;
NBD8() {}
NBD8(Solution *const sol) {
diff = -sol->Eval();
while (true) {
const int triangleIdx = rand(0, triangleNodes.size());
const auto &nodes = triangleNodes[triangleIdx];
const int _i0 = rand(0, 3);
const int _i1 = rand_other_than(0, 3, _i0);
idx0 = nodes[_i0];
idx1 = nodes[_i1];
oldH0 = sol->hs[idx0];
oldH1 = sol->hs[idx1];
sol->ChangeHeight(idx0, oldH1);
sol->ChangeHeight(idx1, oldH0);
diff += sol->Eval();
break;
}
}
void Restore(Solution *sol) const override {
sol->ChangeHeight(idx0, oldH0);
sol->ChangeHeight(idx1, oldH1);
}
};
struct NBDGenerator {
NBD *Generate(Solution *const sol, const int g, const double progress) {
if (g == 0 || sol->Score() > best_sol.Score()) {
best_sol = *sol;
}
#ifdef LOCAL
if (g % 100000 == 0) {
// cout << *sol << endl;
}
#endif
const int random = rand(0, 105);
if (random < 75) {
nbd1_ = NBD1(sol);
return &nbd1_;
// } else if (random < -1) {
// nbd2_ = NBD2(sol);
// return &nbd2_;
} else if (random < 95) {
nbd3_ = NBD3(sol);
return &nbd3_;
} else if (random < 100) {
nbd4_ = NBD4(sol);
return &nbd4_;
// } else if (random < -1) {
// nbd5_ = NBD5(sol);
// return &nbd5_;
} else if (random < 105) {
nbd6_ = NBD6(sol);
return &nbd6_;
// } else if (random < -1) {
// nbd7_ = NBD7(sol);
// return &nbd7_;
// } else if (random < -1) {
// nbd8_ = NBD8(sol);
// return &nbd8_;
} else {
assert(false);
}
}
const Solution &GetBestSol() const { return best_sol; }
private:
NBD1 nbd1_;
NBD2 nbd2_;
NBD3 nbd3_;
NBD4 nbd4_;
NBD5 nbd5_;
NBD6 nbd6_;
NBD7 nbd7_;
NBD8 nbd8_;
Solution best_sol;
};
void Run() {
Solution first_sol = Solution::CreateInitialSol();
NBDGenerator gen;
SimulatedAnnealing<Solution, NBDGenerator> SA(1990 - global_timer.ms(),
PARAMS[0], PARAMS[1]);
const auto final_sol = SA.run(first_sol, gen);
const auto best_sol = gen.GetBestSol();
cerr << "score: " << best_sol.Score() << endl;
cout << best_sol << endl;
}
/* start */
class Solver {
public:
Solver() {}
void Solve() {
Run();
return;
}
private:
};
int main(int argc, char* argv[]) {
fast_io;
if (argc >= 2) {
int idx = 0;
for (int i = 1; i < argc; ++i) {
PARAMS[idx++] = std::stod(argv[i]);
}
}
Timer timer;
timer.start();
Output::StaticInit(cin);
Solver solver;
solver.Solve();
return 0;
}
提出情報
コンパイルエラー
Main.cpp: In member function ‘const Timers::Dummy& Timers::operator[](const std::string&)’:
Main.cpp:249:46: warning: unused parameter ‘str’ [-Wunused-parameter]
249 | const Dummy& operator[](const std::string& str) { return dummy; }
| ~~~~~~~~~~~~~~~~~~~^~~
Main.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Timers&)’:
Main.cpp:250:57: warning: unused parameter ‘timers’ [-Wunused-parameter]
250 | friend ostream& operator<<(ostream& os, const Timers& timers) { return os; }
| ~~~~~~~~~~~~~~^~~~~~
Main.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Output&)’:
Main.cpp:324:57: warning: unused parameter ‘output’ [-Wunused-parameter]
324 | friend ostream &operator<<(ostream &os, const Output &output) { return os; }
| ~~~~~~~~~~~~~~^~~~~~
Main.cpp: In member function ‘NBD* NBDGenerator::Generate(Solution*, int, double)’:
Main.cpp:807:64: warning: unused parameter ‘progress’ [-Wunused-parameter]
807 | NBD *Generate(Solution *const sol, const int g, const double progress) {
| ~~~~~~~~~~~~~^~~~~~~~
Main.cpp:845:3: warning: control reaches end of non-void function [-Wreturn-type]
845 | }
| ^
ジャッジ結果
| セット名 |
test_ALL |
| 得点 / 配点 |
76629030 / 300000000000 |
| 結果 |
|
| セット名 |
テストケース |
| test_ALL |
test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| test_0000.txt |
AC |
1993 ms |
4264 KiB |
| test_0001.txt |
AC |
1992 ms |
4424 KiB |
| test_0002.txt |
AC |
1993 ms |
4368 KiB |
| test_0003.txt |
AC |
1992 ms |
4396 KiB |
| test_0004.txt |
AC |
1992 ms |
4280 KiB |
| test_0005.txt |
AC |
1992 ms |
4320 KiB |
| test_0006.txt |
AC |
1992 ms |
4408 KiB |
| test_0007.txt |
AC |
1992 ms |
4260 KiB |
| test_0008.txt |
AC |
1992 ms |
4260 KiB |
| test_0009.txt |
AC |
1992 ms |
4276 KiB |
| test_0010.txt |
AC |
1992 ms |
4404 KiB |
| test_0011.txt |
AC |
1992 ms |
4284 KiB |
| test_0012.txt |
AC |
1992 ms |
4416 KiB |
| test_0013.txt |
AC |
1992 ms |
4308 KiB |
| test_0014.txt |
AC |
1992 ms |
4280 KiB |
| test_0015.txt |
AC |
1992 ms |
4252 KiB |
| test_0016.txt |
AC |
1992 ms |
4372 KiB |
| test_0017.txt |
AC |
1992 ms |
4364 KiB |
| test_0018.txt |
AC |
1992 ms |
4360 KiB |
| test_0019.txt |
AC |
1992 ms |
4252 KiB |
| test_0020.txt |
AC |
1992 ms |
4356 KiB |
| test_0021.txt |
AC |
1992 ms |
4284 KiB |
| test_0022.txt |
AC |
1992 ms |
4248 KiB |
| test_0023.txt |
AC |
1992 ms |
4400 KiB |
| test_0024.txt |
AC |
1992 ms |
4248 KiB |
| test_0025.txt |
AC |
1992 ms |
4404 KiB |
| test_0026.txt |
AC |
1992 ms |
4256 KiB |
| test_0027.txt |
AC |
1992 ms |
4276 KiB |
| test_0028.txt |
AC |
1992 ms |
4300 KiB |
| test_0029.txt |
AC |
1993 ms |
4248 KiB |
| test_0030.txt |
AC |
1992 ms |
4368 KiB |
| test_0031.txt |
AC |
1992 ms |
4284 KiB |
| test_0032.txt |
AC |
1992 ms |
4356 KiB |
| test_0033.txt |
AC |
1992 ms |
4372 KiB |
| test_0034.txt |
AC |
1992 ms |
4412 KiB |
| test_0035.txt |
AC |
1992 ms |
4260 KiB |
| test_0036.txt |
AC |
1992 ms |
4356 KiB |
| test_0037.txt |
AC |
1992 ms |
4348 KiB |
| test_0038.txt |
AC |
1992 ms |
4408 KiB |
| test_0039.txt |
AC |
1992 ms |
4364 KiB |
| test_0040.txt |
AC |
1992 ms |
4324 KiB |
| test_0041.txt |
AC |
1992 ms |
4280 KiB |
| test_0042.txt |
AC |
1992 ms |
4400 KiB |
| test_0043.txt |
AC |
1992 ms |
4416 KiB |
| test_0044.txt |
AC |
1993 ms |
4280 KiB |
| test_0045.txt |
AC |
1992 ms |
4372 KiB |
| test_0046.txt |
AC |
1992 ms |
4320 KiB |
| test_0047.txt |
AC |
1992 ms |
4276 KiB |
| test_0048.txt |
AC |
1992 ms |
4260 KiB |
| test_0049.txt |
AC |
1992 ms |
4408 KiB |
| test_0050.txt |
AC |
1992 ms |
4420 KiB |
| test_0051.txt |
AC |
1992 ms |
4416 KiB |
| test_0052.txt |
AC |
1992 ms |
4328 KiB |
| test_0053.txt |
AC |
1992 ms |
4368 KiB |
| test_0054.txt |
AC |
1992 ms |
4400 KiB |
| test_0055.txt |
AC |
1992 ms |
4276 KiB |
| test_0056.txt |
AC |
1992 ms |
4264 KiB |
| test_0057.txt |
AC |
1992 ms |
4340 KiB |
| test_0058.txt |
AC |
1992 ms |
4252 KiB |
| test_0059.txt |
AC |
1992 ms |
4248 KiB |
| test_0060.txt |
AC |
1992 ms |
4400 KiB |
| test_0061.txt |
AC |
1992 ms |
4256 KiB |
| test_0062.txt |
AC |
1992 ms |
4344 KiB |
| test_0063.txt |
AC |
1992 ms |
4280 KiB |
| test_0064.txt |
AC |
1992 ms |
4408 KiB |
| test_0065.txt |
AC |
1992 ms |
4372 KiB |
| test_0066.txt |
AC |
1992 ms |
4352 KiB |
| test_0067.txt |
AC |
1992 ms |
4388 KiB |
| test_0068.txt |
AC |
1992 ms |
4404 KiB |
| test_0069.txt |
AC |
1992 ms |
4256 KiB |
| test_0070.txt |
AC |
1992 ms |
4256 KiB |
| test_0071.txt |
AC |
1992 ms |
4400 KiB |
| test_0072.txt |
AC |
1992 ms |
4248 KiB |
| test_0073.txt |
AC |
1992 ms |
4408 KiB |
| test_0074.txt |
AC |
1992 ms |
4300 KiB |
| test_0075.txt |
AC |
1992 ms |
4364 KiB |
| test_0076.txt |
AC |
1992 ms |
4344 KiB |
| test_0077.txt |
AC |
1992 ms |
4404 KiB |
| test_0078.txt |
AC |
1992 ms |
4324 KiB |
| test_0079.txt |
AC |
1992 ms |
4368 KiB |
| test_0080.txt |
AC |
1992 ms |
4364 KiB |
| test_0081.txt |
AC |
1992 ms |
4368 KiB |
| test_0082.txt |
AC |
1992 ms |
4420 KiB |
| test_0083.txt |
AC |
1992 ms |
4424 KiB |
| test_0084.txt |
AC |
1992 ms |
4284 KiB |
| test_0085.txt |
AC |
1992 ms |
4400 KiB |
| test_0086.txt |
AC |
1992 ms |
4368 KiB |
| test_0087.txt |
AC |
1992 ms |
4280 KiB |
| test_0088.txt |
AC |
1992 ms |
4368 KiB |
| test_0089.txt |
AC |
1992 ms |
4400 KiB |
| test_0090.txt |
AC |
1992 ms |
4404 KiB |
| test_0091.txt |
AC |
1992 ms |
4228 KiB |
| test_0092.txt |
AC |
1992 ms |
4360 KiB |
| test_0093.txt |
AC |
1992 ms |
4396 KiB |
| test_0094.txt |
AC |
1992 ms |
4412 KiB |
| test_0095.txt |
AC |
1992 ms |
4252 KiB |
| test_0096.txt |
AC |
1992 ms |
4416 KiB |
| test_0097.txt |
AC |
1992 ms |
4256 KiB |
| test_0098.txt |
AC |
1992 ms |
4244 KiB |
| test_0099.txt |
AC |
1992 ms |
4240 KiB |
| test_0100.txt |
AC |
1992 ms |
4368 KiB |
| test_0101.txt |
AC |
1992 ms |
4400 KiB |
| test_0102.txt |
AC |
1992 ms |
4324 KiB |
| test_0103.txt |
AC |
1992 ms |
4248 KiB |
| test_0104.txt |
AC |
1992 ms |
4428 KiB |
| test_0105.txt |
AC |
1992 ms |
4264 KiB |
| test_0106.txt |
AC |
1992 ms |
4400 KiB |
| test_0107.txt |
AC |
1992 ms |
4280 KiB |
| test_0108.txt |
AC |
1992 ms |
4300 KiB |
| test_0109.txt |
AC |
1992 ms |
4264 KiB |
| test_0110.txt |
AC |
1992 ms |
4320 KiB |
| test_0111.txt |
AC |
1992 ms |
4244 KiB |
| test_0112.txt |
AC |
1993 ms |
4372 KiB |
| test_0113.txt |
AC |
1992 ms |
4416 KiB |
| test_0114.txt |
AC |
1992 ms |
4408 KiB |
| test_0115.txt |
AC |
1992 ms |
4368 KiB |
| test_0116.txt |
AC |
1992 ms |
4324 KiB |
| test_0117.txt |
AC |
1992 ms |
4396 KiB |
| test_0118.txt |
AC |
1992 ms |
4416 KiB |
| test_0119.txt |
AC |
1992 ms |
4280 KiB |
| test_0120.txt |
AC |
1992 ms |
4256 KiB |
| test_0121.txt |
AC |
1992 ms |
4408 KiB |
| test_0122.txt |
AC |
1992 ms |
4408 KiB |
| test_0123.txt |
AC |
1992 ms |
4404 KiB |
| test_0124.txt |
AC |
1992 ms |
4284 KiB |
| test_0125.txt |
AC |
1992 ms |
4320 KiB |
| test_0126.txt |
AC |
1992 ms |
4368 KiB |
| test_0127.txt |
AC |
1992 ms |
4420 KiB |
| test_0128.txt |
AC |
1992 ms |
4280 KiB |
| test_0129.txt |
AC |
1992 ms |
4248 KiB |
| test_0130.txt |
AC |
1992 ms |
4408 KiB |
| test_0131.txt |
AC |
1992 ms |
4300 KiB |
| test_0132.txt |
AC |
1992 ms |
4352 KiB |
| test_0133.txt |
AC |
1992 ms |
4372 KiB |
| test_0134.txt |
AC |
1992 ms |
4364 KiB |
| test_0135.txt |
AC |
1992 ms |
4404 KiB |
| test_0136.txt |
AC |
1992 ms |
4400 KiB |
| test_0137.txt |
AC |
1993 ms |
4248 KiB |
| test_0138.txt |
AC |
1992 ms |
4248 KiB |
| test_0139.txt |
AC |
1992 ms |
4320 KiB |
| test_0140.txt |
AC |
1992 ms |
4360 KiB |
| test_0141.txt |
AC |
1992 ms |
4260 KiB |
| test_0142.txt |
AC |
1992 ms |
4348 KiB |
| test_0143.txt |
AC |
1992 ms |
4424 KiB |
| test_0144.txt |
AC |
1992 ms |
4344 KiB |
| test_0145.txt |
AC |
1992 ms |
4324 KiB |
| test_0146.txt |
AC |
1992 ms |
4248 KiB |
| test_0147.txt |
AC |
1992 ms |
4300 KiB |
| test_0148.txt |
AC |
1992 ms |
4396 KiB |
| test_0149.txt |
AC |
1992 ms |
4416 KiB |