Submission #64985698
Source Code Expand
// bool TEST = true;
bool TEST = false;
int TARGET = 0;
const double T_START = 5000;
const double T_FINAL = 1;
const double T_RATE = T_FINAL / T_START;
const double TIME_LIMIT = 1.9;
const bool SA = 0;
using namespace std;
#include<bits/stdc++.h>
#include<fstream>
#include <iostream>
#include <cstdlib>
#include <dirent.h>
string cur_file; // 現在実行中の入力ファイル名
#define rep(i,n) for(ll (i)=0;(i)<(ll)(n);i++)
#define rrep(i,n) for(ll (i)=(ll)(n)-1;(i)>=0;i--)
#define range(i,start,end,step) for(ll (i)=start;(i)<(ll)(end);(i)+=(step))
#define rrange(i,start,end,step) for(ll (i)=start;(i)>(ll)(end);(i)+=(step))
#define dump(x) cerr << "Line " << __LINE__ << ": " << #x << " = " << (x) << "\n";
#define spa << " " <<
#define cma << "," <<
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define allr(a) (a).rbegin(),(a).rend()
using ld = long double;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pdd = pair<ld, ld>;
template<typename T> using V = vector<T>;
template<typename T> using VV = V<V<T>>;
template<typename T, typename T2> using P = pair<T, T2>;
template<typename T, typename T2> using M = map<T, T2>;
template<typename T> using S = set<T>;
template<typename T, typename T2> using UM = unordered_map<T, T2>;
template<typename T> using PQ = priority_queue<T, V<T>, greater<T>>;
template<typename T> using rPQ = priority_queue<T, V<T>, less<T>>;
template<class T>vector<T> make_vec(size_t a){return vector<T>(a);}
template<class T, class... Ts>auto make_vec(size_t a, Ts... ts){return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));}
template<class SS, class T> ostream& operator << (ostream& os, const pair<SS, T> v){os << "(" << v.first << ", " << v.second << ")"; return os;}
template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { for (auto &e : v) os << e << ' '; return os; }
template<class T> ostream& operator<<(ostream& os, const vector<vector<T>> &v){ for(auto &e : v){os << e << "\n";} return os;}
struct fast_ios { fast_ios(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_;
template <class T> void UNIQUE(vector<T> &x) {sort(all(x));x.erase(unique(all(x)), x.end());}
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
void fail() { cout << -1 << '\n'; exit(0); }
inline int popcount(const int x) { return __builtin_popcount(x); }
inline int popcount(const ll x) { return __builtin_popcountll(x); }
template<typename T> void debug(vector<vector<T>>&v){for(ll i=0;i<v.size();i++)
{cerr<<v[i][0];for(ll j=1;j<v[i].size();j++)cerr spa v[i][j];cerr<<"\n";}};
template<typename T> void debug(vector<T>&v){if(v.size()!=0)cerr<<v[0];
for(ll i=1;i<v.size();i++)cerr spa v[i];
cerr<<"\n";};
template<typename T> void debug(priority_queue<T>&v){V<T> vals; while(!v.empty()) {cerr << v.top() << " "; vals.push_back(v.top()); v.pop();} cerr<<"\n"; for(auto val: vals) v.push(val);}
template<typename T, typename T2> void debug(map<T,T2>&v){for(auto [k,v]: v) cerr << k spa v << "\n"; cerr<<"\n";}
template<typename T, typename T2> void debug(unordered_map<T,T2>&v){for(auto [k,v]: v) cerr << k spa v << "\n";cerr<<"\n";}
V<int> listrange(int n) {V<int> res(n); rep(i,n) res[i]=i; return res;}
template<typename T> P<T,T> divmod(T a, T b) {return make_pair(a/b, a%b);}
template<typename T> T SUM(V<T> a){T val(0); for (auto v : a) val += v; return val;}
#define VISUALIZE // 提出時にはここをコメントアウトすること。そうしないとTLEする。
#ifdef VISUALIZE
bool VISUALIZE_FLAG = true;
// std::ofstream cout << "#svis "("VisCommands.txt");
// ビジュアライザ上で表示される時間を指定します
#define vis_time(t) cout << "#svis " << "time = " << (t) << ";" << endl;
// ビジュアライザ上で常に表示されます
#define vis_always(t) vis_time(-1)
// リファレンス https://p5js.org/reference/
// Web上のエディタ https://editor.p5js.org/
#define vis_arc(x, y, w, h, start, stop) cout << "#svis " << "arc( " << (x) << ", " << (y) << ", " << (w) << ", " << (h) << ", " << (start) << ", " << (stop) << ");" << endl;
#define vis_ellipse(x, y, w, h) cout << "#svis " << "ellipse( " << (x) << ", " << (y) << ", " << (w) << ", " << (h) << ");" << endl;
#define vis_circle(x, y, d) cout << "#svis " << "circle( " << (x) << ", " << (y) << ", " << (d) << ");" << endl;
#define vis_line(x1, y1, x2, y2) cout << "#svis " << "line( " << (x1) << ", " << (y1) << ", " << (x2) << ", " << (y2) << ");" << endl;
#define vis_point(x, y) cout << "#svis " << "point( " << (x) << ", " << (y) << ");" << endl;
#define vis_quad(x1, y1, x2, y2, x3, y3, x4, y4) cout << "#svis " << "quad( " << (x1) << ", " << (y1) << ", " << (x2) << ", " << (y2) << ", " << (x3) << ", " << (y3) << ", " << (x4) << ", " << (y4) << ");" << endl;
#define vis_rect(x, y, w, h) cout << "#svis " << "rect( " << (x) << ", " << (y) << ", " << (w) << ", " << (h) << ");" << endl;
#define vis_square(x, y, s) cout << "#svis " << "square( " << (x) << ", " << (y) << ", " << (s) << ");" << endl;
#define vis_triangle(x1, y1, x2, y2, x3, y3) cout << "#svis " << "triangle( " << (x1) << ", " << (y1) << ", " << (x2) << ", " << (y2) << ", " << (x3) << ", " << (y3) << ");" << endl;
#define vis_background(r, g, b) cout << "#svis " << "background(" << (r) << ", " << (g) << ", " << (b) << ");" << endl;
#define vis_clear() cout << "#svis " << "clear();" << endl;
#define vis_colorMode(mode, max1, max2, max3, maxA) cout << "#svis " << "colorMode(" << (mode) << ", " << (max1) << ", " << (max2) << ", " << (max3) << ", " << (maxA) << ");" << endl;
#define vis_fill(r, g, b, a) cout << "#svis " << "fill(" << (r) << ", " << (g) << ", " << (b) << ", " << (a) << ");" << endl;
#define vis_noFill() cout << "#svis " << "noFill();" << endl;
#define vis_noStroke() cout << "#svis " << "noStroke();" << endl;
#define vis_stroke(r, g, b, a) cout << "#svis " << "stroke(" << (r) << ", " << (g) << ", " << (b) << ", " << (a) << ");" << endl;
#define vis_erase() cout << "#svis " << "erase();" << endl;
#define vis_noErase() cout << "#svis " << "noErase();" << endl;
#define vis_textAlign(alignX, alignY) cout << "#svis " << "textAlign(" << (alignX) << ", " << (alignY) << ");" << endl;
#define vis_textLeading(leading) cout << "#svis " << "textLeading(" << (leading) << ");" << endl;
#define vis_textSize(size) cout << "#svis " << "textSize(" << (size) << ");" << endl;
#define vis_textStyle(style) cout << "#svis " << "textStyle(" << (style) << ");" << endl;
#define vis_textWidth(text) cout << "#svis " << "textWidth(" << (text) << ");" << endl;
#define vis_textAscent() cout << "#svis " << "textAscent();" << endl;
#define vis_textDescent() cout << "#svis " << "textDescent();" << endl;
#define vis_textWrap(wrap) cout << "#svis " << "textWrap(" << (wrap) << ");" << endl;
#define vis_text(str, x, y) cout << "#svis " << "text(" \
<< "\"" << (str) << "\"" \
<< ", " << (x) << ", " << (y) << ");" << endl;
#else // VISUALIZE
bool VISUALIZE_FLAG = false;
#define vis_time(t)
#define vis_always(t)
#define vis_arc(x, y, w, h, start, stop)
#define vis_ellipse(x, y, w, h)
#define vis_circle(x, y, d)
#define vis_line(x1, y1, x2, y2)
#define vis_point(x, y)
#define vis_quad(x1, y1, x2, y2, x3, y3, x4, y4)
#define vis_rect(x, y, w, h)
#define vis_square(x, y, s)
#define vis_triangle(x1, y1, x2, y2, x3, y3)
#define vis_background(r, g, b)
#define vis_clear()
#define vis_colorMode(mode, max1, max2, max3, maxA)
#define vis_fill(r, g, b, a)
#define vis_noFill()
#define vis_noStroke()
#define vis_stroke(r, g, b, a)
#define vis_erase()
#define vis_noErase()
#define vis_textAlign(alignX, alignY)
#define vis_textLeading(leading)
#define vis_textSize(size)
#define vis_textStyle(style)
#define vis_textWidth(text)
#define vis_textAscent()
#define vis_textDescent()
#define vis_textWrap(wrap)
#define vis_text(str, x, y)
#endif // VISUALIZE
//----------- p5visualizerのマクロ(ここまで) -------------
const ll INF = (1ll<<62);
// const ld EPS = 1e-10;
// const ld PI = acos(-1.0);
static unsigned int xxx=123456789,yyy=362436069,zzz=521288629,www=88675123;
unsigned int randxor()
{
unsigned int t;
t=(xxx^(xxx<<11));xxx=yyy;yyy=zzz;zzz=www; return( www=(www^(www>>19))^(t^(t>>8)) );
}
V<unsigned int> _rs;
const int RAND_SIZE = 100000;
int _rs_ind = 0;
inline unsigned int randint() {
++_rs_ind;
if (_rs_ind==RAND_SIZE) _rs_ind = 0;
return _rs[_rs_ind];
}
int random_select(V<ll> &vals) {
// vals の重みで [0, vals.size()) からサンプリング
ll s = 0;
for (auto v : vals) s += v;
ll val = randint()%s;
rep(i, vals.size()) {val -= vals[i]; if (val<=0) return i;}
return vals.size()-1;
}
const int BUNBO = 1e9;
double uniform_rand () {
return double(randxor()%BUNBO+1) / double(BUNBO);
}
V<double> TIME_LIST;
auto _START_TIME = chrono::system_clock::now();
double current_time() {
return chrono::duration_cast<chrono::microseconds>(chrono::system_clock::now() - _START_TIME).count() * 1e-6;
}
// ソルバークラスのひな型
struct Board {
// 焼きなましの雛形
inline double temp(double t_now, double tl, double t0) {
// 指数減衰
return T_START * pow(T_RATE, ((t_now - t0) / (tl - t0)));
}
int try_update_0(double thred) {
// スコア差分 thred より良ければ内部状態を更新する
// 更新したかの 0/1 を返す
return 0;
}
int try_update_1(double thred) {
// スコア差分 thred より良ければ内部状態を更新する
// 更新したかの 0/1 を返す
return 0;
}
void sa(double tl) {
// 時間制限 tl まで実行する
int rc = 0;
int suc = 0;
V<int> suc_lst(5); // 各近傍の成功数のカウント
V<int> rc_lst(5); // 各近傍の成功数のカウント
double t_now;
double t0 = current_time();
while (true) {
if ((t_now=current_time())>=tl) break;
double thred;
if (SA) thred = log(uniform_rand()) * temp(t_now, tl, t0);
else thred = 0;
int r = randint()%100;
P<int,int> res; // {近傍種類, 成否}
if (r<15) res = {0, try_update_0(thred)};
else res = {1, try_update_1(thred)};
if (res.second) {
suc_lst[res.first]++;
suc++;
}
rc_lst[res.first]++;
rc++;
}
debug(rc_lst);
debug(suc_lst);
}
};
using Real = double;
const Real EPS = 1e-8;
const Real PI = acos(static_cast< Real >(-1));
enum {
OUT, ON, IN
};
inline int sign(const Real &r) {
return r <= -EPS ? -1 : r >= EPS ? 1 : 0;
}
inline bool equals(const Real &a, const Real &b) {
return sign(a - b) == 0;
}
enum TrashType {
BURNABLE = 0,
NON_BURNABLE = 1,
RECYCLABLE = 2
};
struct Trash {
int x, y;
int ttype; // 0 = burnable, 1 = non-burnable, 2 = recyclable
Trash(int x, int y, int ttype): x(x), y(y), ttype(ttype) {}
};
class InputManager {
public:
int X, Y, Z; // Counts of each trash type
vector<Trash> trashes;
void read_input() {
cin >> X >> Y >> Z;
int total = X + Y + Z;
for (int i = 0; i < total; ++i) {
int x, y;
cin >> x >> y;
int ttype;
if (i < X) ttype = BURNABLE;
else if (i < X + Y) ttype = NON_BURNABLE;
else ttype = RECYCLABLE;
trashes.emplace_back(x, y, ttype);
}
}
vector<Trash> get_trashes_by_type(int ttype) const {
vector<Trash> result;
for (const auto& t : trashes) {
if (t.ttype == ttype) result.push_back(t);
}
return result;
}
};
struct MoveCommand {
vector<pair<int, int>> hands; // size must be 4
MoveCommand(const vector<pair<int, int>>& hands): hands(hands) {
assert(hands.size() == 4);
}
};
class OutputManager {
public:
vector<MoveCommand> commands;
void set_initial_positions(pair<int, int> takahashi_l, pair<int, int> takahashi_r,
pair<int, int> aoki_l, pair<int, int> aoki_r) {
commands.emplace_back(vector<pair<int, int>>{takahashi_l, takahashi_r, aoki_l, aoki_r});
}
void add_move(pair<int, int> takahashi_l, pair<int, int> takahashi_r,
pair<int, int> aoki_l, pair<int, int> aoki_r) {
commands.emplace_back(vector<pair<int, int>>{takahashi_l, takahashi_r, aoki_l, aoki_r});
}
void print_output() const {
for (const auto& cmd : commands) {
for (int i = 0; i < 4; ++i) {
cout << cmd.hands[i].first << " " << cmd.hands[i].second;
if (i < 3) cout << " ";
}
cout << '\n';
}
}
};
// 判定関数
long long orient(pair<int, int> a, pair<int, int> b, pair<int, int> p) {
return 1LL * (b.first - a.first) * (p.second - a.second) - 1LL * (b.second - a.second) * (p.first - a.first);
}
bool in_triangle(pair<int, int> a, pair<int, int> b, pair<int, int> c, pair<int, int> p) {
if(a==b && b == c && a != p) return false;
long long c1 = orient(a, b, p);
long long c2 = orient(b, c, p);
long long c3 = orient(c, a, p);
return (c1 >= 0 && c2 >= 0 && c3 >= 0) || (c1 <= 0 && c2 <= 0 && c3 <= 0);
}
double dist(pair<int, int> a, pair<int, int> b) {
return hypot(a.first - b.first, a.second - b.second);
}
pair<bool, int> validate_and_score(const InputManager& input, const OutputManager& output) {
set<pair<int, int>> burnable_set, nonburnable_set, recyclable_set;
for (const auto& t : input.trashes) {
if (t.ttype == BURNABLE) burnable_set.emplace(t.x, t.y);
else if (t.ttype == NON_BURNABLE) nonburnable_set.emplace(t.x, t.y);
else recyclable_set.emplace(t.x, t.y);
}
if (output.commands.empty()) return {false, 0};
auto prev = output.commands[0].hands;
double total_time = 0.0;
for (size_t i = 1; i < output.commands.size(); ++i) {
auto curr = output.commands[i].hands;
auto a1 = prev[0], a2 = prev[1], a3 = curr[0], a4 = curr[1];
auto b1 = prev[2], b2 = prev[3], b3 = curr[2], b4 = curr[3];
set<pair<int, int>> new_recyclable;
for (const auto& p : recyclable_set) {
if (in_triangle(a1, a2, a3, p) || in_triangle(a3, a2, a4, p) ||
in_triangle(b1, b2, b3, p) || in_triangle(b3, b2, b4, p)) {
cerr << in_triangle(a1, a2, a3, p) <<" " << in_triangle(a3, a2, a4, p) << endl;
cerr << in_triangle(b1, b2, b3, p) << " " << in_triangle(b3, b2, b4, p) << endl;
cerr << a1 << a2 << a3 << a4 << b1 << b2 << b3 << b4 << p << endl;
return {false, 0};
}
new_recyclable.insert(p);
}
recyclable_set = move(new_recyclable);
set<pair<int, int>> new_burnable;
for (const auto& p : burnable_set) {
if (!(in_triangle(a1, a2, a3, p) || in_triangle(a3, a2, a4, p))) {
new_burnable.insert(p);
}
}
burnable_set = move(new_burnable);
set<pair<int, int>> new_nonburnable;
for (const auto& p : nonburnable_set) {
if (!(in_triangle(b1, b2, b3, p) || in_triangle(b3, b2, b4, p))) {
new_nonburnable.insert(p);
}
}
nonburnable_set = move(new_nonburnable);
double takahashi_cost = dist(prev[0], curr[0]) + dist(prev[1], curr[1]);
double aoki_cost = dist(prev[2], curr[2]) + dist(prev[3], curr[3]);
total_time += max(takahashi_cost, aoki_cost);
prev = curr;
}
cerr << "---" << endl;
for(auto pos: burnable_set)
cerr << pos << endl;
cerr << "---" << endl;
cerr << "---" << endl;
for(auto pos: nonburnable_set)
cerr << pos << endl;
cerr << "---" << endl;
if (!burnable_set.empty() || !nonburnable_set.empty()) return {false, 0};
if (total_time <= 1e8) {
int score = round(1e6 * (1 + log2(1e8 / total_time)));
return {true, score};
} else {
int total_collected = input.X + input.Y + input.Z - recyclable_set.size();
int max_possible = input.X + input.Y + input.Z;
int score = round(1e6 * (double(total_collected) / max_possible));
return {true, score};
}
}
// ユーティリティ:ユークリッド距離
double euclidean(pair<int, int> a, pair<int, int> b) {
return hypot(a.first - b.first, a.second - b.second);
}
// 与えられた点集合 points の凸包(反時計回り)を構築
vector<pair<int, int>> compute_convex_hull(vector<pair<int, int>> points) {
sort(points.begin(), points.end());
points.erase(unique(points.begin(), points.end()), points.end());
int n = points.size();
if (n <= 2) return points;
vector<pair<int, int>> hull;
for (int phase = 0; phase < 2; ++phase) {
int start = hull.size();
for (int i = 0; i < n; ++i) {
while (hull.size() >= start + 2 && orient(hull[hull.size() - 2], hull[hull.size() - 1], points[i]) <= 0)
hull.pop_back();
hull.push_back(points[i]);
}
hull.pop_back();
reverse(points.begin(), points.end());
}
return hull;
}
// ゴミが含まれていたら true
bool is_invalid_triangle(pair<int, int> a, pair<int, int> b, pair<int, int> c, const set<pair<int, int>>& forbidden) {
for (const auto& p : forbidden) {
if (in_triangle(a, b, c, p)) return true;
}
return false;
}
// 凸包構築(target の index から始めて資源・他人ゴミの混入を避ける)
vector<pair<int, int>> build_safe_convex_hull(const vector<pair<int, int>>& target, int& start_index,
const set<pair<int, int>>& forbidden) {
vector<pair<int, int>> region;
for (int i = start_index; i < target.size(); ++i) {
region.push_back(target[i]);
auto hull = compute_convex_hull(region);
bool valid = true;
int m = hull.size();
for (int j = 0; j < m; ++j) {
pair<int, int> a = hull[j];
pair<int, int> b = hull[(j + 1) % m];
pair<int, int> c = target[i];
if (is_invalid_triangle(a, b, c, forbidden)) {
valid = false;
break;
}
}
if (!valid) {
region.pop_back();
break;
} else {
start_index = i + 1;
}
}
return compute_convex_hull(region);
}
// 掃除経路を構成(現在位置→スタート→凸包→合流点)
// 結果は「一人分の手の動き」のみ生成する(後で統合するため)
pair<vector<pii>, vector<pii>> build_hand_path(pair<int, int> cur_pos,
const vector<pair<int, int>>& hull,
const pair<int, int>& target_next) {
vector<pair<int, int>> pathA;
vector<pii> pathB;
if (hull.empty()) return make_pair(pathA, pathB);
int start_idx = 0;
double min_dist = euclidean(cur_pos, hull[0]);
for (int i = 1; i < hull.size(); ++i) {
double d = euclidean(cur_pos, hull[i]);
if (d < min_dist) {
min_dist = d;
start_idx = i;
}
}
int end_idx = 0;
min_dist = euclidean(target_next, hull[0]);
for(int i=1; i<hull.size(); i++) {
double d = euclidean(target_next, hull[i]);
if(d < min_dist) {
min_dist = d;
end_idx = i;
}
}
for (int i = 0; i < hull.size() + 1; ++i) {
int idx = (start_idx + i) % hull.size();
pathA.push_back(hull[idx]);
if(idx == end_idx && start_idx != end_idx) break;
}
for(int i=0; i<hull.size() + 1; i++) {
int idx = (start_idx + 2 * hull.size() - i) % hull.size();
pathB.push_back(hull[idx]);
if(idx == end_idx) break;
}
// prepend current position and return
// pathA.insert(pathA.begin(), cur_pos);
assert(pathA.size() + pathB.size() == hull.size() + 2);
return make_pair(pathA, pathB);
}
void padding(vector<pii> &dat, pii elem, int border) {
while(dat.size() < border) dat.push_back(elem);
}
// 高橋と青木の target を元に経路を作り、時間ごとに両者を進めて OutputManager に記録
void simulate_routes(const vector<pair<int, int>>& takahashi_target,
const vector<pair<int, int>>& aoki_target,
const set<pair<int, int>>& forbidden,
OutputManager& out) {
int t_index = 0, a_index = 0;
pair<int, int> t_pos = {0, 0}, a_pos = {0, 0};
if(takahashi_target.size() > 0)
t_pos = takahashi_target[0];
if(aoki_target.size() > 0)
a_pos = aoki_target[0];
set<pii> forbidden_t;
set<pii> forbidden_a;
for(auto pos: forbidden) {
forbidden_a.insert(pos);
forbidden_t.insert(pos);
}
for(auto pos: takahashi_target) {
forbidden_a.insert(pos);
}
for(auto pos: aoki_target) {
forbidden_t.insert(pos);
}
while (t_index < takahashi_target.size() || a_index < aoki_target.size()) {
int prev_t_index = t_index;
int prev_a_index = a_index;
cerr << t_index << " " << a_index << endl;
vector<pair<int, int>> t_hull = build_safe_convex_hull(takahashi_target, t_index, forbidden_t);
vector<pair<int, int>> a_hull = build_safe_convex_hull(aoki_target, a_index, forbidden_a);
pair<int, int> t_next = (t_index < takahashi_target.size() ? takahashi_target[t_index] : t_pos);
pair<int, int> a_next = (a_index < aoki_target.size() ? aoki_target[a_index] : a_pos);
auto t_path = build_hand_path(t_pos, t_hull, t_next);
auto a_path = build_hand_path(a_pos, a_hull, a_next);
auto t_path_left = t_path.first;
auto t_path_right = t_path.second;
auto a_path_left = a_path.first;
auto a_path_right = a_path.second;
padding(t_path_left, t_pos,1);
padding(t_path_right, t_pos,1);
padding(a_path_left, a_pos,1);
padding(a_path_right, a_pos,1);
// 両者のパスの長さをそろえて補完(短い側は最後の点を繰り返す)
int steps = max({t_path_left.size(), t_path_right.size(), a_path_left.size(), a_path_right.size()});
padding(t_path_left, t_path_left.back(),steps);
padding(t_path_right, t_path_right.back(),steps);
padding(a_path_left, a_path_left.back(),steps);
padding(a_path_right, a_path_right.back(),steps);
for (int i = 0; i < steps; ++i) {
vector<pair<int, int>> hands(4);
hands[0] = t_path_left[i]; // 高橋左手
hands[1] = t_path_right[i]; // 高橋右手
hands[2] = a_path_left[i]; // 青木左手
hands[3] = a_path_right[i]; // 青木右手
out.commands.push_back(MoveCommand(hands));
}
// out.commands.push_back(MoveCommand({t_path[1], t_path[1], a_path[1], a_path[1]}));
assert(t_path_left.back() == t_path_right.back());
assert(a_path_left.back() == a_path_right.back());
// 現在位置更新
if (!t_path_left.empty()) t_pos = t_path_left.back();
if (!a_path_left.empty()) a_pos = a_path_left.back();
for(int i = prev_a_index; i<a_index; i++) {
forbidden_t.erase(aoki_target[i]);
}
for(int i = prev_t_index; i<t_index; i++) {
forbidden_a.erase(takahashi_target[i]);
// cerr <<"cleared " << takahashi_target[i] << endl;
}
}
}
mt19937 rng(0);
// TSP 用 2-opt 法による経路改善
vector<pair<int, int>> tsp_2opt( vector<pair<int, int>>& points, int iter = 10000) {
int n = points.size();
if(n==0) return points;
vector<int> route(n);
iota(route.begin(), route.end(), 0);
auto total_length = [&](const vector<int>& r) {
double sum = 0;
for (int i = 0; i < n - 1; ++i) {
sum += euclidean(points[r[i]], points[r[i + 1]]);
}
sum += euclidean(points[r[0]], points[r[n-1]]);
return sum;
};
double best = total_length(route);
for (int it = 0; it < iter; ++it) {
if(it % 10 == 0) {
vector<pii> tmp;
for(int i=n/2; i<n; i++)
tmp.push_back(points[i]);
for(int i=0; i<n/2; i++)
tmp.push_back(points[i]);
points = tmp;
}
int a = uniform_int_distribution<int>(0, n - 2)(rng);
int b = uniform_int_distribution<int>(a + 1, n - 1)(rng);
reverse(route.begin() + a, route.begin() + b + 1);
double new_len = total_length(route);
if (new_len < best) {
best = new_len;
} else {
reverse(route.begin() + a, route.begin() + b + 1); // rollback
}
}
vector<pair<int, int>> reordered;
for (int i : route) reordered.push_back(points[i]);
return reordered;
}
// TSP 初期解:貪欲法で近い点を選んでいく(その後 2-opt に渡せる)
vector<pair<int, int>> tsp_greedy(const vector<pair<int, int>>& points) {
int n = points.size();
if (n == 0) return {};
vector<bool> used(n, false);
vector<pair<int, int>> path;
path.push_back(points[0]);
used[0] = true;
for (int step = 1; step < n; ++step) {
int best_idx = -1;
double best_dist = 1e18;
for (int i = 0; i < n; ++i) {
if (!used[i]) {
double d = euclidean(path.back(), points[i]);
if (d < best_dist) {
best_dist = d;
best_idx = i;
}
}
}
path.push_back(points[best_idx]);
used[best_idx] = true;
}
return path;
}
void get_randomize(vector<pii>& dat) {
if(dat.size() == 0)
return ;
vector<pii> ret;
int idx = rng() % dat.size();
for(int i=idx; i<dat.size(); i++) ret.push_back(dat[i]);
for(int i=0; i<idx; i++) ret.push_back(dat[i]);
dat = ret;
}
ll Main() {
InputManager im;
im.read_input();
auto burnable = im.get_trashes_by_type(BURNABLE);
auto unburnable = im.get_trashes_by_type(NON_BURNABLE);
pair<int, int> POS_CORNER = pii(0, 0);
vector<pii> tmp;
for(auto pos: burnable) {
tmp.push_back(pii(pos.x, pos.y));
}
tmp = tsp_greedy(tmp);
auto burnable2 = tsp_2opt(tmp);
tmp.clear();
for(auto pos: unburnable) {
tmp.push_back(pii(pos.x, pos.y));
}
tmp = tsp_greedy(tmp);
auto unburnable2 = tsp_2opt(tmp);
auto recycle = im.get_trashes_by_type(RECYCLABLE);
set<pii> recycle2;
for(auto pos: recycle)
recycle2.insert(pii(pos.x, pos.y));
cerr << "aaa" << endl;
OutputManager om_best;
double score_best = -10;
while(true) {
OutputManager om;
simulate_routes(burnable2, unburnable2, recycle2, om);
auto res = validate_and_score(im, om);
cerr << res << endl;
if(score_best < res.second) {
score_best = res.second;
om_best.commands = om.commands;
}
get_randomize(burnable2);
get_randomize(unburnable2);
if(current_time() > 1.5) break;
if(!res.first) continue;
}
om_best.print_output();
cerr << validate_and_score(im, om_best) << endl;
return 0;
}
V<string> search_dir(const char *path, int l, int l2){
DIR *dp;
dp = opendir(path);
if (dp==NULL) exit(1);
dirent* entry = readdir(dp);
V<string> fs;
while (entry != NULL){
string s = string(path, l) + string(entry->d_name, l2);
if (s[s.length()-1]=='t') {
fs.push_back(s);
}
entry = readdir(dp);
}
return fs;
}
void Main_test(int argc, char* argv[]){
// テスト時はこちらが走る
// TARGET>=0 が指定されている場合、その番号のみを実行する
// コマンドライン引数が与えられている場合、TARGET に代入する
V<string> fs = search_dir("./in/", 5, 8); // (ディレクトリ名長さ, ファイル名長さ)
ll s_all = 0;
int cc = 0;
if (argc>1) TARGET = atoi(argv[1]);
if (TARGET>=0) fs = {fs[TARGET]};
for (auto f : fs) {
cur_file = f;
cout << f << endl;
// std::ifstream in(f);
// std::cin.rdbuf(in.rdbuf());
_START_TIME = chrono::system_clock::now();
std::cout << std::fixed << std::setprecision(15);
s_all += Main();
}
cout << double(s_all) / fs.size() << endl;
}
int main(int argc, char* argv[]){
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
if (TEST) Main_test(argc, argv);
else Main();
return 0;
}
Submission Info
Compile Error
Main.cpp: In function ‘V<int> listrange(int)’:
Main.cpp:21:25: warning: unnecessary parentheses in declaration of ‘i’ [-Wparentheses]
21 | #define rep(i,n) for(ll (i)=0;(i)<(ll)(n);i++)
| ^~~
Main.cpp:70:41: note: in expansion of macro ‘rep’
70 | V<int> listrange(int n) {V<int> res(n); rep(i,n) res[i]=i; return res;}
| ^~~
Main.cpp:21:25: note: remove parentheses
21 | #define rep(i,n) for(ll (i)=0;(i)<(ll)(n);i++)
| ^~~
Main.cpp:70:41: note: in expansion of macro ‘rep’
70 | V<int> listrange(int n) {V<int> res(n); rep(i,n) res[i]=i; return res;}
| ^~~
Main.cpp: In function ‘int random_select(V<long long int>&)’:
Main.cpp:21:25: warning: unnecessary parentheses in declaration of ‘i’ [-Wparentheses]
21 | #define rep(i,n) for(ll (i)=0;(i)<(ll)(n);i++)
| ^~~
Main.cpp:187:5: note: in expansion of macro ‘rep’
187 | rep(i, vals.size()) {val -= vals[i]; if (val<=0) return i;}
| ^~~
Main.cpp:21:25: note: remove parentheses
21 | #define rep(i,n) for(ll (i)=0;(i)<(ll)(n);i++)
| ^~~
Main.cpp:187:5: note: in expansion of macro ‘rep’
187 | rep(i, vals.size()) {val -= vals[i]; if (val<=0) return i;}
| ^~~
Main.cpp: In member function ‘int Board::try_update_0(double)’:
Main.cpp:208:29: warning: unused parameter ‘thred’ [-Wunused-parameter]
208 | int try_update_0(double thred) {
| ~~~~~~~^~~~~
Main.cpp: In member function ‘int Board::try_update_1(double)’:
Main.cpp:213:29: warning: unused parameter ‘thred’ [-Wunused-parameter]
213 | int try_update_1(double thred) {
| ~~~~~~~^~~~~
Main.cpp: In function ‘std::vector<std::pair<int, int> > compute_convex_hull(std::vector<std::pair<int, int> >)’:
Main.cpp:445:32: warning: comparison of integer expressions of different signedness: ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare]
445 | while (hull.size() >= start + 2 && orient(hull[hull.size() - 2], hull[hull.size() - 1], points[i]) <= 0)
| ~~~~~~~~~~~~^~~~~~~~~~~~
Main.cpp: In function ‘std::vector<std::pair<int, int> > build_safe_convex_hull(const std::vector<std::pair<int, int> >&, int&, const std::set<std::pair<int, int> >&)’:
Main.cpp:467:33: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
467 | for (int i = start_index; i < target.size(); ++i) {
| ~~^~~~~~~~~~~~~~~
Main.cpp: In function ‘std::pair<std::vector<std::pair<int, int> >, std::vector<std::pair<int, int> > > build_hand_path(std::pair<int, int>, const std::vector<std::pair<int, int> >&, const std::pair<int, int>&)’:
Main.cpp:502:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
502 | for (int i = 1; i < hull.size(); ++i) {
| ~~^~~~~~~~~~~~~
Main.cpp:512:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
512 | for(int i=1; i<hull.size(); i++) {
| ~^~~~~~~~~~~~
Main.cpp:522:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
522 | for (int i = 0; i < hull.size() + 1; ++i) {
| ~~^~~~~~~~~~~~~~~~~
Main.cpp:527:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
527 | for(int i=0; i<hull.size() + 1; i++) {
| ~^~~~~~~~~~~~~~~~
Main.cpp: In function ‘void padding(std::vector<std::pair<int, int> >&, pii, int)’:
Main.cpp:540:22: warning: comparison of integer expressions of different signedness: ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare]
540 | while(dat.size() < border) dat.push_back(elem);
| ~~~~~~~~~~~^~~~~~~~
Main.cpp: In function ‘void simulate_routes(const std::vector<std::pair<int, int> >&, const std::vector<std::pair<int, int> >&, const std::set<std::pair<int, int> >&, OutputManager&)’:
Main.cpp:572:20: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
572 | while (t_index < takahashi_target.size() || a_index < aoki_target.size()) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:572:57: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
572 | while (t_index < takahashi_target.size() || a_index < aoki_target.size()) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
Main.cpp:580:42: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
580 | pair<int, int> t_next = (t_index < takahashi_target.size() ? takahashi_target[t_index] : t_pos);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:581:42: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
581 | pair<int, int> a_next = (a_index < aoki_target.size() ? aoki_target[a_index] : a_pos);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
Main.cpp: In function ‘void get_randomize(std::vector<std::pair<int, int> >&)’:
Main.cpp:709:21: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
709 | for(int i=idx; i<dat.size(); i++) ret.push_back(dat[i]);
| ~^~~~~~~~~~~
Main.cpp: In function ‘ll Main()’:
Main.cpp:725:20: warning: variable ‘POS_CORNER’ set but not used [-Wunused-but-set-variable]
725 | pair<int, int> POS_CORNER = pii(0, 0);
| ^~~~~~~~~~
Main.cpp: In function ‘void Main_test(int, char**)’:
Main.cpp:799:9: warning: unused variable ‘cc’ [-Wunused-variable]
799 | int cc = 0;
| ^~
Main.cpp: In instantiation of ‘void debug(std::vector<_Tp>&) [with T = int]’:
Main.cpp:242:14: required from here
Main.cpp:65:13: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
65 | for(ll i=1;i<v.size();i++)cerr spa v[i];
| ~^~~~~~~~~
Judge Result
| Set Name |
test_ALL |
| Score / Max Score |
577383467 / 1500000000 |
| Status |
|
| Set Name |
Test Cases |
| 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 |
| Case Name |
Status |
Exec Time |
Memory |
| test_0000.txt |
AC |
1502 ms |
3700 KiB |
| test_0001.txt |
AC |
1502 ms |
3656 KiB |
| test_0002.txt |
AC |
1502 ms |
3696 KiB |
| test_0003.txt |
AC |
1504 ms |
3696 KiB |
| test_0004.txt |
AC |
1501 ms |
3732 KiB |
| test_0005.txt |
AC |
1503 ms |
3728 KiB |
| test_0006.txt |
AC |
1502 ms |
3696 KiB |
| test_0007.txt |
AC |
1505 ms |
3840 KiB |
| test_0008.txt |
AC |
1502 ms |
3564 KiB |
| test_0009.txt |
AC |
1501 ms |
3696 KiB |
| test_0010.txt |
AC |
1502 ms |
3716 KiB |
| test_0011.txt |
AC |
1502 ms |
3712 KiB |
| test_0012.txt |
AC |
1503 ms |
3616 KiB |
| test_0013.txt |
AC |
1503 ms |
3840 KiB |
| test_0014.txt |
AC |
1502 ms |
3556 KiB |
| test_0015.txt |
AC |
1501 ms |
3712 KiB |
| test_0016.txt |
AC |
1502 ms |
3564 KiB |
| test_0017.txt |
AC |
1503 ms |
3696 KiB |
| test_0018.txt |
AC |
1502 ms |
3760 KiB |
| test_0019.txt |
AC |
1503 ms |
3716 KiB |
| test_0020.txt |
AC |
1504 ms |
3844 KiB |
| test_0021.txt |
AC |
1502 ms |
3704 KiB |
| test_0022.txt |
AC |
1501 ms |
3600 KiB |
| test_0023.txt |
AC |
1503 ms |
3832 KiB |
| test_0024.txt |
AC |
1501 ms |
3580 KiB |
| test_0025.txt |
AC |
1502 ms |
3676 KiB |
| test_0026.txt |
AC |
1502 ms |
3780 KiB |
| test_0027.txt |
AC |
1502 ms |
3624 KiB |
| test_0028.txt |
AC |
1501 ms |
3544 KiB |
| test_0029.txt |
AC |
1502 ms |
3684 KiB |
| test_0030.txt |
AC |
1503 ms |
3704 KiB |
| test_0031.txt |
AC |
1502 ms |
3680 KiB |
| test_0032.txt |
AC |
1504 ms |
3868 KiB |
| test_0033.txt |
AC |
1503 ms |
3556 KiB |
| test_0034.txt |
AC |
1501 ms |
3688 KiB |
| test_0035.txt |
AC |
1502 ms |
3848 KiB |
| test_0036.txt |
AC |
1503 ms |
3848 KiB |
| test_0037.txt |
AC |
1502 ms |
3836 KiB |
| test_0038.txt |
AC |
1503 ms |
3848 KiB |
| test_0039.txt |
AC |
1503 ms |
3724 KiB |
| test_0040.txt |
AC |
1503 ms |
3840 KiB |
| test_0041.txt |
AC |
1504 ms |
3776 KiB |
| test_0042.txt |
AC |
1502 ms |
3700 KiB |
| test_0043.txt |
AC |
1502 ms |
3700 KiB |
| test_0044.txt |
AC |
1502 ms |
3712 KiB |
| test_0045.txt |
AC |
1502 ms |
3612 KiB |
| test_0046.txt |
AC |
1504 ms |
3588 KiB |
| test_0047.txt |
AC |
1503 ms |
3696 KiB |
| test_0048.txt |
AC |
1502 ms |
3840 KiB |
| test_0049.txt |
AC |
1502 ms |
3644 KiB |
| test_0050.txt |
AC |
1502 ms |
3668 KiB |
| test_0051.txt |
AC |
1503 ms |
3848 KiB |
| test_0052.txt |
AC |
1503 ms |
3848 KiB |
| test_0053.txt |
AC |
1502 ms |
3748 KiB |
| test_0054.txt |
AC |
1503 ms |
3564 KiB |
| test_0055.txt |
AC |
1502 ms |
3844 KiB |
| test_0056.txt |
AC |
1502 ms |
3836 KiB |
| test_0057.txt |
AC |
1502 ms |
3712 KiB |
| test_0058.txt |
AC |
1503 ms |
3648 KiB |
| test_0059.txt |
AC |
1503 ms |
3836 KiB |
| test_0060.txt |
AC |
1504 ms |
3712 KiB |
| test_0061.txt |
AC |
1502 ms |
3560 KiB |
| test_0062.txt |
AC |
1502 ms |
3832 KiB |
| test_0063.txt |
AC |
1501 ms |
3804 KiB |
| test_0064.txt |
AC |
1502 ms |
3748 KiB |
| test_0065.txt |
AC |
1502 ms |
3680 KiB |
| test_0066.txt |
AC |
1503 ms |
3696 KiB |
| test_0067.txt |
AC |
1502 ms |
3716 KiB |
| test_0068.txt |
AC |
1502 ms |
3720 KiB |
| test_0069.txt |
AC |
1502 ms |
3708 KiB |
| test_0070.txt |
AC |
1502 ms |
3632 KiB |
| test_0071.txt |
AC |
1503 ms |
3848 KiB |
| test_0072.txt |
AC |
1504 ms |
3648 KiB |
| test_0073.txt |
AC |
1502 ms |
3840 KiB |
| test_0074.txt |
AC |
1502 ms |
3552 KiB |
| test_0075.txt |
AC |
1502 ms |
3640 KiB |
| test_0076.txt |
AC |
1502 ms |
3564 KiB |
| test_0077.txt |
AC |
1502 ms |
3756 KiB |
| test_0078.txt |
AC |
1501 ms |
3744 KiB |
| test_0079.txt |
AC |
1501 ms |
3740 KiB |
| test_0080.txt |
AC |
1502 ms |
3844 KiB |
| test_0081.txt |
AC |
1502 ms |
3708 KiB |
| test_0082.txt |
AC |
1504 ms |
3836 KiB |
| test_0083.txt |
AC |
1502 ms |
3800 KiB |
| test_0084.txt |
AC |
1502 ms |
3748 KiB |
| test_0085.txt |
AC |
1504 ms |
3700 KiB |
| test_0086.txt |
AC |
1503 ms |
3748 KiB |
| test_0087.txt |
AC |
1502 ms |
3628 KiB |
| test_0088.txt |
AC |
1502 ms |
3780 KiB |
| test_0089.txt |
AC |
1504 ms |
3728 KiB |
| test_0090.txt |
AC |
1501 ms |
3648 KiB |
| test_0091.txt |
AC |
1503 ms |
3624 KiB |
| test_0092.txt |
AC |
1502 ms |
3548 KiB |
| test_0093.txt |
AC |
1502 ms |
3836 KiB |
| test_0094.txt |
AC |
1504 ms |
3636 KiB |
| test_0095.txt |
AC |
1502 ms |
3792 KiB |
| test_0096.txt |
AC |
1501 ms |
3648 KiB |
| test_0097.txt |
AC |
1501 ms |
3676 KiB |
| test_0098.txt |
AC |
1504 ms |
3768 KiB |
| test_0099.txt |
AC |
1502 ms |
3648 KiB |
| test_0100.txt |
AC |
1502 ms |
3588 KiB |
| test_0101.txt |
AC |
1502 ms |
3836 KiB |
| test_0102.txt |
AC |
1503 ms |
3780 KiB |
| test_0103.txt |
AC |
1502 ms |
3796 KiB |
| test_0104.txt |
AC |
1503 ms |
3656 KiB |
| test_0105.txt |
AC |
1503 ms |
3844 KiB |
| test_0106.txt |
AC |
1503 ms |
3700 KiB |
| test_0107.txt |
AC |
1501 ms |
3608 KiB |
| test_0108.txt |
AC |
1503 ms |
3784 KiB |
| test_0109.txt |
AC |
1503 ms |
3744 KiB |
| test_0110.txt |
AC |
1505 ms |
3784 KiB |
| test_0111.txt |
AC |
1503 ms |
3648 KiB |
| test_0112.txt |
AC |
1502 ms |
3548 KiB |
| test_0113.txt |
AC |
1501 ms |
3516 KiB |
| test_0114.txt |
AC |
1502 ms |
3712 KiB |
| test_0115.txt |
AC |
1502 ms |
3828 KiB |
| test_0116.txt |
AC |
1501 ms |
3608 KiB |
| test_0117.txt |
AC |
1502 ms |
3756 KiB |
| test_0118.txt |
AC |
1503 ms |
3704 KiB |
| test_0119.txt |
AC |
1501 ms |
3708 KiB |
| test_0120.txt |
AC |
1504 ms |
3648 KiB |
| test_0121.txt |
AC |
1502 ms |
3836 KiB |
| test_0122.txt |
AC |
1503 ms |
3836 KiB |
| test_0123.txt |
AC |
1502 ms |
3692 KiB |
| test_0124.txt |
AC |
1503 ms |
3660 KiB |
| test_0125.txt |
AC |
1502 ms |
3832 KiB |
| test_0126.txt |
AC |
1503 ms |
3792 KiB |
| test_0127.txt |
AC |
1502 ms |
3692 KiB |
| test_0128.txt |
AC |
1502 ms |
3664 KiB |
| test_0129.txt |
AC |
1501 ms |
3712 KiB |
| test_0130.txt |
AC |
1503 ms |
3740 KiB |
| test_0131.txt |
AC |
1503 ms |
3648 KiB |
| test_0132.txt |
AC |
1502 ms |
3696 KiB |
| test_0133.txt |
AC |
1502 ms |
3604 KiB |
| test_0134.txt |
AC |
1502 ms |
3704 KiB |
| test_0135.txt |
AC |
1502 ms |
3692 KiB |
| test_0136.txt |
AC |
1501 ms |
3612 KiB |
| test_0137.txt |
AC |
1501 ms |
3712 KiB |
| test_0138.txt |
AC |
1502 ms |
3696 KiB |
| test_0139.txt |
AC |
1502 ms |
3676 KiB |
| test_0140.txt |
AC |
1502 ms |
3564 KiB |
| test_0141.txt |
AC |
1502 ms |
3700 KiB |
| test_0142.txt |
AC |
1502 ms |
3704 KiB |
| test_0143.txt |
AC |
1502 ms |
3784 KiB |
| test_0144.txt |
AC |
1502 ms |
3668 KiB |
| test_0145.txt |
AC |
1501 ms |
3756 KiB |
| test_0146.txt |
AC |
1501 ms |
3756 KiB |
| test_0147.txt |
AC |
1502 ms |
3512 KiB |
| test_0148.txt |
AC |
1502 ms |
3692 KiB |
| test_0149.txt |
AC |
1504 ms |
3848 KiB |