Submission #53164249
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
const double INF = 1e18;
class Xorshift {
public:
Xorshift(uint32_t seed): x_(seed) {
// assert(seed);
}
uint32_t randrange(uint32_t stop) {
// [0, stop)
// assert(stop > 0);
next();
return x_ % stop;
}
uint32_t randrange(uint32_t start, uint32_t stop) {
// [start, stop)
// assert(start < stop);
next();
return start + x_ % (stop - start);
}
uint32_t randint(uint32_t a, uint32_t b) {
// [a, b]
// assert(a <= b);
return randrange(a, b + 1);
}
double random() {
// [0.0, 1.0]
next();
return static_cast<double>(x_) * (1.0 / static_cast<double>(UINT32_MAX));
}
double uniform(double a, double b) {
// [a, b] or [b, a]
return a + (b - a) * random();
}
private:
void next() {
x_ ^= x_ << 13;
x_ ^= x_ >> 17;
x_ ^= x_ << 5;
}
uint32_t x_;
};
class Timer {
public:
Timer() {
begin();
elapsed_time_ = 0.0;
}
void begin() {
start_time_ = chrono::system_clock::now();
}
double get_time() {
chrono::system_clock::time_point end_time = chrono::system_clock::now();
elapsed_time_ = chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time_).count();
elapsed_time_ *= 1e-9; // nanoseconds -> seconds
return elapsed_time_;
}
double get_last_time() const {
return elapsed_time_;
}
bool yet(double time_limit) {
return get_time() < time_limit;
}
double progress(double time_limit) {
return get_time() / time_limit;
}
private:
chrono::system_clock::time_point start_time_;
double elapsed_time_;
};
Xorshift rng(998244353);
Timer timer;
double time_limit = 1.9;
mt19937 engine(998244353);
int n,m;
double eps,delta;
const int MAX_T = 5000;
const double M = 100000.0;
const int B = 3000;
const double POINT_BUFFER = 2000.0;
bool dummy = false;
double clamp(double x){
if (x <= -M){
return -M+1;
}
if (x >= M){
return M-1;
}
return x;
}
double normal(double x, double mean, double stdDev) {
double v = (x - mean) / stdDev;
return exp(-0.5 * v * v);
}
class P {
public:
double x, y;
// コンストラクタ
P(double x = 0, double y = 0) : x(x), y(y) {}
// 加算演算子のオーバーロード
P operator+(const P& a) const {
return P(x + a.x, y + a.y);
}
// 減算演算子のオーバーロード
P operator-(const P& a) const {
return P(x - a.x, y - a.y);
}
// スカラー乗算演算子のオーバーロード
P operator*(double a) const {
return P(x * a, y * a);
}
// 等価演算子
bool operator==(const P& other) const {
return (x == other.x) && (y == other.y);
}
// 不等価演算子
bool operator!=(const P& other) const {
return !(*this == other);
}
double dot(const P& a) const {
return x * a.x + y * a.y;
}
double det(const P& a) const {
return x * a.y - y * a.x;
}
double abs2() const {
return dot(*this);
}
double abs() const {
return sqrt(abs2());
}
static P gets(P cand, double lim){
double now = cand.abs();
P ret = cand * (lim / now);
return ret;
}
// デバッグ用の出力演算子オーバーロード
friend ostream& operator<<(ostream& os, const P& p) {
return os << " " << p.x << " " << p.y << " ";
}
static double dist2_sp(const P& p1, const P& p2, const P& q) {
if ((p2 - p1).dot(q - p1) <= 0.0) {
return (q - p1).abs2();
} else if ((p1 - p2).dot(q - p2) <= 0.0) {
return (q - p2).abs2();
} else {
return dist2_lp(p1, p2, q);
}
}
static double dist2_lp(const P& p1, const P& p2, const P& q) {
double det = (p2 - p1).det(q - p1);
return (det * det) / (p2 - p1).abs2();
}
static bool crs_sp(const P& p1, const P& p2, const P& q) {
return (q - p1).dot(q - p2) <= 0.0;
}
static bool crs_lp(const P& p1, const P& p2, const P& q) {
return (p2 - p1).det(q - p1) == 0.0;
}
static bool crs_ss(const P& p1, const P& p2, const P& q1, const P& q2) {
auto sort = [](double a, double b) {
return minmax(a, b);
};
auto [lp0, up0] = minmax(p1.x, p2.x);
auto [lq0, uq0] = minmax(q1.x, q2.x);
auto [lp1, up1] = minmax(p1.y, p2.y);
auto [lq1, uq1] = minmax(q1.y, q2.y);
if (up0 < lq0 || uq0 < lp0 || up1 < lq1 || uq1 < lp1) {
return false;
}
return sig((p2 - p1).det(q1 - p1)) * sig((p2 - p1).det(q2 - p1)) <= 0
&& sig((q2 - q1).det(p1 - q1)) * sig((q2 - q1).det(p2 - q1)) <= 0;
}
static P proj(const P& p1, const P& p2, const P& q) {
double d = (p2 - p1).abs2();
if (d == 0.0) return p1;
P r = p1 * d + (p2-p1) * (p2-p1).dot(q-p1);
return P(r.x / d, r.y /d);
}
static P pi_ll(const P& p1, const P& p2, const P& q1, const P& q2) {
double d = (q2 - q1).det(p2 - p1);
if (d == 0.0) {
return P(INF,INF);
}
P r = p1 * d + (p2 - p1) * (q2 - q1).det(q1 - p1);
return P(r.x / d, r.y / d);
}
static int sig(double x) {
if (x > 0) return 1;
if (x < 0) return -1;
return 0;
}
};
vector<P> ps;
vector<bool> finished(10);
P now;
P v;
vector<pair<P,P>> walls;
vector<vector<double>> points_dists(100,vector<double>(100,INF));
vector<P> path_points;
int path_points_num = 0;
void Input() {
cin >> n >> m >> eps >> delta;
double x,y;
cin >> x >> y;
now = P(x,y);
v = P(0,0);
ps.resize(n);
for (int i = 0; i < n; i++){
double x,y;
cin >> x >> y;
ps[i] = P(x,y);
}
walls.resize(m+4);
for (int i = 0; i < m; i++){
double x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
walls[i] = {P(x1,y1),P(x2,y2)};
}
walls[m] = {P(-M,-M),P{M,-M}};
walls[m+1] = {P(M,-M),P{M,M}};
walls[m+2] = {P(M,M),P{-M,M}};
walls[m+3] = {P(-M,M),P{-M,-M}};
m += 4;
for (int i = 0; i < n; i++){
path_points.push_back(ps[i]);
}
for (int i = 0; i < m; i++){
auto [p1,p2] = walls[i];
P dif = p2 - p1;
P buf = P::gets(dif,POINT_BUFFER);
path_points.push_back(p2 + dif);
path_points.push_back(p1 - dif);
}
path_points_num = path_points.size();
for (int i = 0 ; i < path_points_num; i++){
for (int j = 0; j < i; j++){
bool ok = false;
for (int x = 0; x < m; x++){
if (P::crs_ss(path_points[i],path_points[j],walls[x].first,walls[x].second)) ok = true;
}
if (ok) continue;
double d = (path_points[i]-path_points[j]).abs();
points_dists[i][j] = d;
points_dists[j][i] = d;
}
}
};
struct Solver{
int best_score = 0;
int current_score = 0;
int turn = 0;
P target_move;
P target_path;
bool need_update_path = true;
// 終了判定
void is_finish(){
bool ok = true;
for (int i = 0; i < n; i++){
if (finished[i] == false) ok = false;
}
if (ok){
exit(0);
}
}
// p1 から p2 の線分が壁に当たるか 当たるなら true
bool hit_wall(P p1, P p2){
bool ok = false;
for (int i = 0; i < m; i++){
if (P::crs_ss(p1,p2,walls[i].first,walls[i].second)) ok = true;
}
return ok;
}
// p1 から dir 方向で最も近い壁との距離 必ず見つかる
double nearest_wall(P p1, P dir){
double dist = INF;
P p2 = p1 + dir;
for (int i = 0; i < m; i++){
P cand = P::pi_ll(p1,p2,walls[i].first,walls[i].second);
if (abs(cand.x - INF) < 1e-8) continue;;
if ( P::sig(dir.det(walls[i].first-p1)) * P::sig(dir.det(walls[i].second-p1)) <= 0 && (cand-p1).dot(dir) >= 0){
double dcand = (cand-p1).abs();
if (dist > dcand){
dist = dcand;
}
}
}
return dist;
}
// 粒子の候補に対して dir 方向の計測を行った時に期待される 距離の分散/距離の平均, 大きいほど嬉しい
double get_dir_var_max(vector<pair<P,P>> &candidate, P dir){
vector<double> ds;
long double ds_sum = 0;
for (auto &c: candidate){
double d = nearest_wall(c.first,dir);
if (abs(d - INF) < 1e-8){
assert (false);
}
ds.push_back(d);
ds_sum += d;
}
long double avg = ds_sum / ds.size();
long double var = 0;
for (auto d: ds){
var += (d-avg) * (d-avg);
}
var /= ds.size();
return sqrt(var)/avg;
}
// p1 から p2 の線分で ポイントを通過するか 通過するなら true
bool hit(P p1, P p2, int i){
return P::dist2_sp(p1,p2,ps[i]) <= 1e6;
}
vector<pair<P,P>> accel_query(P a, vector<pair<P,P>>& candidate){
cout << "A " << (int)a.x << " " << (int)a.y << endl;
for (auto &c: candidate){
c.second = c.second + a;
}
return candidate;
}
vector<pair<P,P>> measurement_query(P a, vector<pair<P,P>>& candidate){
cout << "S " << (int)a.x << " " << (int)a.y << endl;
double res;
cin >> res;
vector<double> probs;
for (auto &cand: candidate){
double d = nearest_wall(cand.first,a);
double alpha = res / max(1e-9,d);
probs.push_back(max(normal(alpha,1.0,delta),1e-18));
}
discrete_distribution weighted(probs.begin(),probs.end());
vector<pair<P,P>> ncandidate;
for (int _ = 0; _ < B; _++){
ncandidate.push_back(candidate[weighted(engine)]);
}
swap(candidate,ncandidate);
return candidate;
}
double update_current_state(vector<pair<P,P>>& candidate){
now = P();
v = P();
for (auto [np,nv] : candidate){
now = now + np;
v = v + nv;
}
now = now * (1.0 / B);
v = v * (1.0 / B);
double sigma = 0;
for (auto [np,nv]: candidate){
sigma += (np - now).abs2();
}
sigma /= B;
sigma = sqrt(sigma);
return sigma;
}
void update_next_target(){
if (need_update_path == false) return ;
int is_end = 0;
int n2 = 1<<n;
for (int i = 0; i < n; i++){
if (finished[i]) is_end |= 1<<i;
}
pair<int,int> empty = {-1,-1};
vector<vector<double>> dp(n,vector<double>(n2,INF));
vector<vector<pair<int,int>>> par(n,vector<pair<int,int>>(n2,empty));
for (int i = 0; i < n; i++){
if (finished[i]) continue;
if (hit_wall(now,ps[i])) continue;
dp[i][is_end|1<<i] = (now-ps[i]).abs();
}
for (int bi = 0; bi < n2; bi++){
for (int i = 0; i < n; i++){
if (dp[i][bi] == INF) continue;
for (int ni = 0; ni < n; ni++){
if (bi >> ni & 1) continue;
if (points_dists[i][ni] == INF) continue;
int nbi = bi | 1 << ni;
int ndist = dp[i][bi] + points_dists[i][ni];
if (ndist < dp[ni][nbi]){
par[ni][nbi] = {i,bi};
dp[ni][nbi] = ndist;
}
}
}
}
double mi = INF;
pair<int,int> last;
for (int i = 0; i < n; i++){
if (dp[i][n2-1] == INF) continue;
if (mi > dp[i][n2-1]){
mi = dp[i][n2-1];
last = {i,n2-1};
}
}
while (true){
auto p = par[last.first][last.second];
if (p == empty){
need_update_path = false;
target_path = ps[last.first];
break;
} else{
last = p;
}
}
}
P decide_next_target(){
update_next_target();
return target_path;
// double dist_max = INF;
// for (int i = 0; i < n; i++){
// if (finished[i]) continue;
// // 壁に当たるかの判定
// if (hit_wall(now,ps[i])) continue;
// double dist = (now - ps[i]).abs2();
// if (dist < dist_max){
// dist_max = dist;
// target_move = ps[i];
// }
// }
// cout << "# target_move = " << target_move;
// cout << "# dist = " << dist_max << (now-target_move).abs2() << endl;;
// if (dist_max != INF){
// dummy = false;
// return target_move;
// }
// if (!dummy){
// dummy = true;
// int x = rng.randint(-100000,100000);
// int y = rng.randint(-100000,100000);
// target_move = P(x,y);
// }
// if (dummy && (hit_wall(now,target_move) || (now - target_move).abs2() < 1e8)){
// double best = INF;
// // cout << "# pos here" << endl;
// for (int _ = 0; _ < 10; _++){
// int x = rng.randint(-95000,95000);
// int y = rng.randint(-95000,95000);
// P q = P(x,y);
// // cout << "# q cand = " << q << endl;
// if (hit_wall(now,q)) continue;
// for (int i = 0; i < n; i++){
// if (finished[i]) continue;
// double dist = (now - q).abs() + (q - ps[i]).abs();
// if (hit_wall(q,ps[i])){
// dist = 1e10 * rng.uniform(1,2);
// }
// if (best > dist){
// best = dist;
// target_move = q;
// }
// }
// }
// // cout << "# best = " << best << " ntarget = " << target_move << endl;
// }
// return target_move;
}
vector<pair<P,P>> next_action(P target, double sigma, int turn, vector<pair<P,P>>& candidate){
P dir = target - now;
P a = dir * min((2000.0 / dir.abs()),1.0) - v;
if (a.abs() > 498.0){
a = a * (498.0 / a.abs());
}
// 条件を満たせば加速
if (a != P() && (turn%2 == 0 || sigma < 1000.0)){
return accel_query(a,candidate);
}
// 計測の方向を最適化
vector<P> cand;
for (int i = 0; i < m; i++){
if (i < m-4){
cand.push_back(walls[i].first-now);
cand.push_back(walls[i].second-now);
} else{
cand.push_back(walls[i].first-now);
}
cand.push_back(P::proj(walls[i].first,walls[i].second,now) - now);
}
vector<P> ncand;
swap(cand,ncand);
for (auto v: ncand){
double d = v.abs();
if (d > 1e5){
v = v * (99998.0 / d);
}
v = P((int)v.x,(int)v.y);
if (v.abs2() > 0.0){
cand.push_back(v);
}
}
vector<P> targets(2);
if (timer.get_time() >= 1.5){
vector<double> scores(2,INF);
for (auto dir: cand){
double d = nearest_wall(now,dir);
if (d < scores[1]){
scores[1] = d;
targets[1] = dir;
} else{
continue;
}
if (scores[1] < scores[0]){
swap(scores[1],scores[0]);
swap(targets[1],targets[0]);
}
}
} else {
vector<double> scores(2,-1.0);
for (auto dir : cand){
double d = get_dir_var_max(candidate,dir);
if (d > scores[1]){
scores[1] = d;
targets[1] = dir;
} else{
continue;
}
if (scores[1] > scores[0]){
swap(scores[1],scores[0]);
swap(targets[1],targets[0]);
}
}
}
if (rng.randrange(0,4) < 3){
return measurement_query(targets[0],candidate);
} else{
return measurement_query(targets[1],candidate);
}
}
vector<pair<P,P>> update_result(vector<pair<P,P>>& candidate){
mt19937 gen(998244353);
normal_distribution<double> normal_dist(0.0,eps);
int c,h;
cin >> c >> h;
cout << "# c = " << c << " h = " << h << endl;
if (c){
current_score -= 100;
}
if (h){
current_score += h * 1000;
}
vector<bool> new_finished(n);
if (h){
need_update_path = true;
for (int i = 0 ; i < h; i++){
int x;
cin >> x;
new_finished[x] = true;
}
}
vector<pair<P,P>> saved = candidate;
int empty = 0;
cout << "# start at " << candidate.size() << endl;
for (int _ = 0; _ < 10; _++){
// if (_) break;
// cout << "# loop = " << _ << endl;
for (auto &cand : candidate){
double r1 = normal_dist(engine);
double r2 = normal_dist(engine);
// cout << "# " << cand.first << " " << cand.second << " " << r1 << " " << r2 << endl;
cand.second.x += r1;
cand.second.y += r2;
}
vector<pair<P,P>> ncandidate;
for (auto &cand: candidate){
if (hit_wall(cand.first,cand.first+cand.second) == c){
ncandidate.push_back(cand);
}
}
if (ncandidate.size()){
cout << "# delete after size = " << ncandidate.size() << endl;
swap(candidate,ncandidate);
while (candidate.size() < B){
candidate.push_back(candidate[rng.randrange(candidate.size())]);
}
} else{
candidate = saved;
empty++;
cout << "# empty before " << endl;
continue;
}
if (c == 1){
cout << "# hit " << endl;
for (auto &cand: candidate){
cand.second = P(0,0);
}
for (int i = 0; i < n; i++){
if (new_finished[i]) finished[i] = true;
}
return candidate;
} else{
for (auto &cand: candidate){
cand.first = cand.first + cand.second;
cand.first.x = clamp(cand.first.x);
cand.first.y = clamp(cand.first.y);
}
bool ok = true;
for (int i = 0; i < n; i++){
if (finished[i]) continue;
ncandidate.clear();
for (auto &cand: candidate){
if (hit(cand.first-cand.second,cand.first,i) == new_finished[i]){
ncandidate.push_back(cand);
}
}
cout << "# delete after size2 = " << i << " " << ncandidate.size() << endl;
if (ncandidate.size()){
swap(candidate,ncandidate);
while (candidate.size() < B){
candidate.push_back(candidate[rng.randrange(candidate.size())]);
}
} else{
candidate = saved;
ok = false;
break;
}
}
if (!ok){
empty++;
continue;
}
for (int i = 0; i < n; i++){
if (new_finished[i]) finished[i] = true;
}
return candidate;
}
break;
}
for (int i = 0; i < n; i++){
if (new_finished[i]) finished[i] = true;
}
if (c == 1){
for (auto &cand: candidate){
cand.first.x += 2e4 * rng.uniform(-1.0,1.0);
cand.first.y += 2e4 * rng.uniform(-1.0,1.0);
cand.first.x = clamp(cand.first.x);
cand.first.y = clamp(cand.first.y);
cand.second = P(0,0);
}
} else{
for (auto &cand: candidate){
cand.first = cand.first + cand.second;
cand.first.x = clamp(cand.first.x);
cand.first.y = clamp(cand.first.y);
}
for (int i = 0; i < n; i++){
if (new_finished[i]){
for (auto &cand: candidate){
cand.first = ps[i] + cand.second;
cand.first.x = clamp(cand.first.x);
cand.first.y = clamp(cand.first.y);
}
}
}
}
cout << "# empty = " << empty << endl;
return candidate;
}
void escape(int turn){
for (int t = turn ; t < MAX_T; t++){
cout << "A 0 0" << endl;
}
exit(0);
}
void solve(){
vector<pair<P,P>> candidate(B,{now,v});
for (int t = 0; t < MAX_T; t++){
best_score = max(best_score,current_score);
current_score -= 2;
cout << "#turn = " << t << " eps = " << eps << " delta = " << delta << endl;
cout << "# ";
for (auto f : finished){
cout << (int)f << " ";
}
cout << endl;
// 全て通過したら終了
is_finish();
if (!timer.yet(time_limit)){
escape(t);
}
// 推定情報を更新
double sigma = update_current_state(candidate);
cout << "#p_pred = " << now << endl;
cout << "#v_pred = " << v << endl;
cout << "#sigma = " << sigma << endl;
// 次の目標を決定
P target = decide_next_target();
// 行動を決定
candidate = next_action(target,sigma,t,candidate);
// 結果による更新
candidate = update_result(candidate);
}
cout << "#end at " << timer.get_time() << endl;
cout << "#score = " << best_score << endl;
}
};
int main() {
Input();
Solver solver = Solver();
solver.solve();
return 0;
}
Submission Info
Compile Error
Main.cpp: In static member function ‘static bool P::crs_ss(const P&, const P&, const P&, const P&)’:
Main.cpp:200:14: warning: variable ‘sort’ set but not used [-Wunused-but-set-variable]
200 | auto sort = [](double a, double b) {
| ^~~~
Main.cpp: In function ‘void Input()’:
Main.cpp:283:11: warning: variable ‘buf’ set but not used [-Wunused-but-set-variable]
283 | P buf = P::gets(dif,POINT_BUFFER);
| ^~~
Judge Result
| Set Name |
test_ALL |
| Score / Max Score |
504574 / 600000 |
| 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 |
| Case Name |
Status |
Exec Time |
Memory |
| test_0000.txt |
AC |
716 ms |
4696 KiB |
| test_0001.txt |
AC |
577 ms |
4708 KiB |
| test_0002.txt |
AC |
686 ms |
4668 KiB |
| test_0003.txt |
AC |
286 ms |
4716 KiB |
| test_0004.txt |
AC |
1009 ms |
4692 KiB |
| test_0005.txt |
AC |
732 ms |
4720 KiB |
| test_0006.txt |
AC |
1521 ms |
4672 KiB |
| test_0007.txt |
AC |
504 ms |
4692 KiB |
| test_0008.txt |
AC |
301 ms |
4564 KiB |
| test_0009.txt |
AC |
479 ms |
4600 KiB |
| test_0010.txt |
AC |
208 ms |
4672 KiB |
| test_0011.txt |
AC |
545 ms |
4716 KiB |
| test_0012.txt |
AC |
197 ms |
4704 KiB |
| test_0013.txt |
AC |
214 ms |
4596 KiB |
| test_0014.txt |
AC |
1208 ms |
4692 KiB |
| test_0015.txt |
AC |
244 ms |
4568 KiB |
| test_0016.txt |
AC |
319 ms |
4580 KiB |
| test_0017.txt |
AC |
409 ms |
4748 KiB |
| test_0018.txt |
AC |
298 ms |
4704 KiB |
| test_0019.txt |
AC |
240 ms |
4648 KiB |
| test_0020.txt |
AC |
253 ms |
4708 KiB |
| test_0021.txt |
AC |
850 ms |
4640 KiB |
| test_0022.txt |
AC |
1201 ms |
4736 KiB |
| test_0023.txt |
AC |
1140 ms |
4560 KiB |
| test_0024.txt |
AC |
754 ms |
4700 KiB |
| test_0025.txt |
AC |
403 ms |
4668 KiB |
| test_0026.txt |
AC |
430 ms |
4720 KiB |
| test_0027.txt |
AC |
643 ms |
4604 KiB |
| test_0028.txt |
AC |
238 ms |
4584 KiB |
| test_0029.txt |
AC |
259 ms |
4640 KiB |
| test_0030.txt |
AC |
396 ms |
4720 KiB |
| test_0031.txt |
AC |
490 ms |
4600 KiB |
| test_0032.txt |
AC |
397 ms |
4648 KiB |
| test_0033.txt |
AC |
212 ms |
4704 KiB |
| test_0034.txt |
AC |
361 ms |
4716 KiB |
| test_0035.txt |
AC |
752 ms |
4700 KiB |
| test_0036.txt |
AC |
563 ms |
4584 KiB |
| test_0037.txt |
AC |
752 ms |
4680 KiB |
| test_0038.txt |
AC |
138 ms |
4512 KiB |
| test_0039.txt |
AC |
1423 ms |
4672 KiB |
| test_0040.txt |
AC |
1067 ms |
4648 KiB |
| test_0041.txt |
AC |
397 ms |
4680 KiB |
| test_0042.txt |
AC |
375 ms |
4720 KiB |
| test_0043.txt |
AC |
538 ms |
4668 KiB |
| test_0044.txt |
AC |
1217 ms |
4564 KiB |
| test_0045.txt |
AC |
123 ms |
4704 KiB |
| test_0046.txt |
AC |
403 ms |
4668 KiB |
| test_0047.txt |
AC |
730 ms |
4708 KiB |
| test_0048.txt |
AC |
274 ms |
4600 KiB |
| test_0049.txt |
AC |
395 ms |
4708 KiB |
| test_0050.txt |
AC |
708 ms |
4708 KiB |
| test_0051.txt |
AC |
457 ms |
4708 KiB |
| test_0052.txt |
AC |
916 ms |
4700 KiB |
| test_0053.txt |
AC |
320 ms |
4684 KiB |
| test_0054.txt |
AC |
143 ms |
4692 KiB |
| test_0055.txt |
AC |
1217 ms |
4640 KiB |
| test_0056.txt |
AC |
182 ms |
4564 KiB |
| test_0057.txt |
AC |
1431 ms |
4708 KiB |
| test_0058.txt |
AC |
877 ms |
4676 KiB |
| test_0059.txt |
AC |
885 ms |
4604 KiB |