Submission #8819575
Source Code Expand
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
#define MOD 1000000007
#define MOD2 998244353
#define int long long
//#define PI 3.14159265358979
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;
template < typename T >
ostream &operator<<(ostream &os, const vector< T > &A) {
for (int i = 0; i < A.size(); i++)
os << A[i] << " ";
os << endl;
return os;
}
template <>
ostream &operator<<(ostream &os, const vector< vector< int > > &A) {
int N = A.size();
int M;
if (N > 0)
M = A[0].size();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++)
os << A[i][j] << " ";
os << endl;
}
return os;
}
typedef pair< int, int > pii;
typedef long long ll;
struct edge {
int from, to, c;
double d;
edge(int _from = 0, int _to = 0, double _d = 0, int _c = 0) {
from = _from;
to = _to;
d = _d;
c = _c;
}
bool operator<(const edge &rhs) const {
return (d == rhs.d) ? (c < rhs.c) : (d < rhs.d);
}
};
typedef vector< edge > edges;
typedef vector< edges > graph;
struct flow {
int to, cap, rev, cost;
flow(int to = 0, int cap = 0, int rev = 0, int cost = 0) : to(to), cap(cap), rev(rev), cost(cost) {}
};
typedef vector< vector< flow > > flows;
const int di[4] = {0, -1, 0, 1};
const int dj[4] = {-1, 0, 1, 0};
const int ci[5] = {0, 0, -1, 0, 1};
const int cj[5] = {0, -1, 0, 1, 0};
const ll LINF = LLONG_MAX / 2;
const int INF = INT_MAX / 2;
const double PI = acos(-1);
template < typename T, typename U >
bool chmin(T &x, const U &y) {
if (x > y) {
x = y;
return true;
}
return false;
}
template < typename T, typename U >
bool chmax(T &x, const U &y) {
if (x < y) {
x = y;
return true;
}
return false;
}
struct initializer {
initializer() {
cout << fixed << setprecision(13);
}
};
initializer _____;
struct point {
double x, y;
point(double x = 0.0, double y = 0.0) : x(x), y(y) {}
point operator+(const point &rhs) const {
return point(x + rhs.x, y + rhs.y);
}
point operator-(const point &rhs) const {
return point(x - rhs.x, y - rhs.y);
}
point operator*(const double d) const {
return point(x * d, y * d);
}
};
double dot(const point &a, const point &b) {
return a.x * b.x + a.y * b.y;
}
double det(const point &a, const point &b) {
return a.x * b.y - a.y * b.x;
}
struct circle {
double r, x, y;
circle(double r = 0.0, double x = 0.0, double y = 0.0) : r(r), x(x), y(y) {}
circle(double r, point p) : r(r), x(p.x), y(p.y) {}
point getCenter() { return point(x, y); }
};
double dist(point a, point b) {
double x = a.x - b.x;
double y = a.y - b.y;
return sqrt(x * x + y * y);
}
bool getCircle(point p1, point p2, double r, point &pc1, point &pc2) {
bool stat = true;
point p3;
double d, l, dx, dy;
p3.x = (p1.x + p2.x) * 0.5;
p3.y = (p1.y + p2.y) * 0.5;
r *= r;
l = (p2.x - p3.x) * (p2.x - p3.x) + (p2.y - p3.y) * (p2.y - p3.y);
if (r >= l) {
d = sqrt(r / l - 1.0);
dx = d * (p2.y - p3.y);
dy = d * (p2.x - p3.x);
pc1.x = p3.x + dx;
pc1.y = p3.y - dy;
pc2.x = p3.x - dx;
pc2.y = p3.y + dy;
} else {
stat = false;
}
return stat;
}
vector< double > dijkstra(graph &G, int s) {
///stat must have "<"&">"
///init d=vector<stat>
vector< double > d(G.size(), (double)LINF);
d[s] = 0;
//init q=p-queue<pair<stat,index> >
priority_queue< pair< double, int >, vector< pair< double, int > >, greater< pair< double, int > > > q;
q.push(pair< double, int >(0.0, s));
while (!q.empty()) {
pair< double, int > p = q.top();
q.pop();
if (d[p.second] < p.first)
continue;
for (int i = 0; i < G[p.second].size(); i++) {
edge e = G[p.second][i];
if (p.first + e.d < d[e.to]) {
d[e.to] = p.first + e.d;
q.push(pair< double, int >(d[e.to], e.to));
}
}
}
return d;
}
int N, M, K, T, Q;
signed main() {
point s, t;
cin >> s.x >> s.y >> t.x >> t.y;
cin >> N;
vector< circle > cs(N);
rep(i, N) {
cin >> cs[i].x >> cs[i].y >> cs[i].r;
}
vector< vector< edge > > G(N + 2);
rep(i, N) rep(j, N) if (i != j) {
double d = dist(cs[i].getCenter(), cs[j].getCenter()) - cs[i].r - cs[j].r;
if (d < 0.0)
d = 0.0;
G[i].push_back(edge(i, j, d));
}
rep(i, N) {
circle c = cs[i];
double d = dist(c.getCenter(), s) - c.r;
if (d < 0.0)
d = 0.0;
G[N].emplace_back(N, i, d);
}
rep(i, N) {
circle c = cs[i];
double d = dist(c.getCenter(), t) - c.r;
if (d < 0.0)
d = 0.0;
G[i].emplace_back(i, N + 1, d);
}
vector< double > d = dijkstra(G, N);
cout << d[N + 1] << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
E - Cosmic Rays |
User |
AltTTT |
Language |
C++14 (GCC 5.4.1) |
Score |
0 |
Code Size |
4920 Byte |
Status |
WA |
Exec Time |
113 ms |
Memory |
38532 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
0 / 600 |
Status |
|
|
Set Name |
Test Cases |
Sample |
0_00.txt, 0_01.txt, 0_02.txt |
All |
0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt, 1_30.txt, 1_31.txt, 1_32.txt, 1_33.txt, 1_34.txt, 1_35.txt, 1_36.txt, 1_37.txt, 1_38.txt, 1_39.txt, 1_40.txt, 1_41.txt, 1_42.txt, 1_43.txt, 1_44.txt, 1_45.txt |
Case Name |
Status |
Exec Time |
Memory |
0_00.txt |
AC |
1 ms |
256 KB |
0_01.txt |
AC |
1 ms |
256 KB |
0_02.txt |
AC |
1 ms |
256 KB |
1_00.txt |
WA |
1 ms |
256 KB |
1_01.txt |
AC |
1 ms |
256 KB |
1_02.txt |
AC |
31 ms |
32256 KB |
1_03.txt |
AC |
31 ms |
32764 KB |
1_04.txt |
AC |
29 ms |
32384 KB |
1_05.txt |
AC |
31 ms |
32784 KB |
1_06.txt |
AC |
28 ms |
32000 KB |
1_07.txt |
AC |
28 ms |
32128 KB |
1_08.txt |
AC |
31 ms |
32764 KB |
1_09.txt |
AC |
31 ms |
32528 KB |
1_10.txt |
AC |
29 ms |
32532 KB |
1_11.txt |
AC |
30 ms |
32384 KB |
1_12.txt |
AC |
30 ms |
32528 KB |
1_13.txt |
AC |
28 ms |
32384 KB |
1_14.txt |
AC |
32 ms |
33040 KB |
1_15.txt |
AC |
33 ms |
33040 KB |
1_16.txt |
AC |
31 ms |
32768 KB |
1_17.txt |
AC |
32 ms |
32784 KB |
1_18.txt |
AC |
31 ms |
32656 KB |
1_19.txt |
AC |
32 ms |
33040 KB |
1_20.txt |
AC |
28 ms |
32256 KB |
1_21.txt |
AC |
29 ms |
32128 KB |
1_22.txt |
AC |
32 ms |
32784 KB |
1_23.txt |
AC |
31 ms |
32784 KB |
1_24.txt |
AC |
32 ms |
33040 KB |
1_25.txt |
AC |
30 ms |
32400 KB |
1_26.txt |
AC |
32 ms |
32764 KB |
1_27.txt |
AC |
30 ms |
32380 KB |
1_28.txt |
AC |
32 ms |
32892 KB |
1_29.txt |
AC |
31 ms |
32892 KB |
1_30.txt |
AC |
28 ms |
32256 KB |
1_31.txt |
AC |
29 ms |
32384 KB |
1_32.txt |
AC |
31 ms |
33040 KB |
1_33.txt |
AC |
31 ms |
32272 KB |
1_34.txt |
WA |
27 ms |
31744 KB |
1_35.txt |
WA |
28 ms |
32384 KB |
1_36.txt |
WA |
28 ms |
32256 KB |
1_37.txt |
WA |
27 ms |
32128 KB |
1_38.txt |
AC |
113 ms |
38148 KB |
1_39.txt |
AC |
113 ms |
38532 KB |
1_40.txt |
AC |
110 ms |
36484 KB |
1_41.txt |
AC |
112 ms |
37892 KB |
1_42.txt |
AC |
30 ms |
32380 KB |
1_43.txt |
AC |
32 ms |
33040 KB |
1_44.txt |
AC |
30 ms |
32892 KB |
1_45.txt |
AC |
35 ms |
33420 KB |