This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
constexpr double ticks_per_sec = 2800000000;
constexpr double ticks_per_sec_inv = 1.0 / ticks_per_sec;
inline double rdtsc() { // in seconds
uint32_t lo, hi;
asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
return (((uint64_t)hi << 32) | lo) * ticks_per_sec_inv;
}
constexpr double TLE = 10.0; // sec
vector<slide_t> result = slides;
ll highscore = score;
cerr << "[*] highscore = " << highscore << endl;
constexpr int TIME_LIMIT = 3000; // msec
chrono::high_resolution_clock::time_point clock_begin = chrono::high_resolution_clock::now();
double temperature = 1;
for (unsigned iteration = 0; ; ++ iteration) {
if (iteration % 128 == 0) {
chrono::high_resolution_clock::time_point clock_end = chrono::high_resolution_clock::now();
temperature = 1 - chrono::duration_cast<chrono::milliseconds>(clock_end - clock_begin).count() / TIME_LIMIT;
if (temperature < 0) {
cerr << "[*] iteration = " << iteration << ": done" << endl;
break;
}
}
int i = uniform_int_distribution<int>(0, s - 1)(gen);
if (i == 0 or i == slides.size() - 1) continue;
int j;
{
int i1 = (bernoulli_distribution(0.5)(gen) ? i - 1 : i + 1);
int tag = choose_tag(slides[i1], photos, gen);
j = lookup_slide[choose(lookup_photo[tag], gen)];
}
if (j == 0 or j == slides.size() - 1) continue;
if (i > j) swap(i, j);
ll delta = 0;
delta -= get_score_delta(slides[i - 1], slides[i], photos);
delta -= get_score_delta(slides[j], slides[j + 1], photos);
delta += get_score_delta(slides[i - 1], slides[j], photos);
delta += get_score_delta(slides[i], slides[j + 1], photos);
auto probability = [&]() {
constexpr double boltzmann = 3;
return exp(boltzmann * delta) * temperature;
};
if (delta >= 0 or bernoulli_distribution(probability())(gen)) {
reverse(slides.begin() + i, slides.begin() + j + 1);
if (delta < 0) {
cerr << "[*] iteration = " << iteration << ": delta = " << delta << ": p = " << probability() << endl;
}
score += delta;
if (highscore < score) {
highscore = score;
result = slides;
cerr << "[*] iteration = " << iteration << ": highscore = " << highscore << endl;
}
} else {
}
}
cerr << "[*] highscore = " << highscore << endl;
return result;
#line 1 "old/marathon.inc.cpp"
constexpr double ticks_per_sec = 2800000000;
constexpr double ticks_per_sec_inv = 1.0 / ticks_per_sec;
inline double rdtsc() { // in seconds
uint32_t lo, hi;
asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
return (((uint64_t)hi << 32) | lo) * ticks_per_sec_inv;
}
constexpr double TLE = 10.0; // sec
vector<slide_t> result = slides;
ll highscore = score;
cerr << "[*] highscore = " << highscore << endl;
constexpr int TIME_LIMIT = 3000; // msec
chrono::high_resolution_clock::time_point clock_begin = chrono::high_resolution_clock::now();
double temperature = 1;
for (unsigned iteration = 0; ; ++ iteration) {
if (iteration % 128 == 0) {
chrono::high_resolution_clock::time_point clock_end = chrono::high_resolution_clock::now();
temperature = 1 - chrono::duration_cast<chrono::milliseconds>(clock_end - clock_begin).count() / TIME_LIMIT;
if (temperature < 0) {
cerr << "[*] iteration = " << iteration << ": done" << endl;
break;
}
}
int i = uniform_int_distribution<int>(0, s - 1)(gen);
if (i == 0 or i == slides.size() - 1) continue;
int j;
{
int i1 = (bernoulli_distribution(0.5)(gen) ? i - 1 : i + 1);
int tag = choose_tag(slides[i1], photos, gen);
j = lookup_slide[choose(lookup_photo[tag], gen)];
}
if (j == 0 or j == slides.size() - 1) continue;
if (i > j) swap(i, j);
ll delta = 0;
delta -= get_score_delta(slides[i - 1], slides[i], photos);
delta -= get_score_delta(slides[j], slides[j + 1], photos);
delta += get_score_delta(slides[i - 1], slides[j], photos);
delta += get_score_delta(slides[i], slides[j + 1], photos);
auto probability = [&]() {
constexpr double boltzmann = 3;
return exp(boltzmann * delta) * temperature;
};
if (delta >= 0 or bernoulli_distribution(probability())(gen)) {
reverse(slides.begin() + i, slides.begin() + j + 1);
if (delta < 0) {
cerr << "[*] iteration = " << iteration << ": delta = " << delta << ": p = " << probability() << endl;
}
score += delta;
if (highscore < score) {
highscore = score;
result = slides;
cerr << "[*] iteration = " << iteration << ": highscore = " << highscore << endl;
}
} else {
}
}
cerr << "[*] highscore = " << highscore << endl;
return result;