답안 #131995

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
131995 2019-07-18T07:27:39 Z 이온조(#3189) Fences (JOI18_fences) C++14
51 / 100
260 ms 48924 KB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using pid = pair<int, double>;
using pdi = pair<double, int>;
using pdd = pair<double, double>;
#define X first
#define Y second

const double eps = 1e-6;

struct line { pdd S, E; };
struct dot { pdd D; int id; bool ps; };
struct node { double v; int c, id; };

bool operator <(node PP, node QQ) { return PP.v > QQ.v; }

inline double f(double x) { return max(x, -x); }
inline double dst(pdd A, pdd B) { return sqrt((A.X-B.X) * (A.X-B.X) + (A.Y-B.Y) * (A.Y-B.Y)); }
inline double CCW(pdd A, pdd B, pdd C) { return A.X*B.Y + B.X*C.Y + C.X*A.Y - A.Y*B.X - B.Y*C.X - C.Y*A.X; }
inline int CCWs(pdd A, pdd B, pdd C) {
	int tmp = CCW(A, B, C);
	if(tmp < 0) return -1;
	if(tmp > 0) return +1;
	if(tmp == 0) return 0;
}
inline bool on(line A, pdd B) {
	if(A.S > A.E) swap(A.S, A.E);
	if(B < A.S || A.E < B) return false;
	return f(CCW(A.S, A.E, B) / dst(A.S, A.E)) < eps;
}
inline bool its(line A, line B) { // strict
	if(on(A, B.S) || on(A, B.E) || on(B, A.S) || on(B, A.E)) return false;
	return CCWs(A.S, A.E, B.S) * CCWs(A.S, A.E, B.E) == -1 && CCWs(B.S, B.E, A.S) * CCWs(B.S, B.E, A.E) == -1;
}
inline pdd push(line A, pdd B) {
	double ds = dst(A.S, A.E);
	double d = f(CCW(A.S, A.E, B) / ds);
	double dx = A.S.Y - A.E.Y, dy = A.E.X - A.S.X;
	pdd PA = {B.X + dx * (d/ds), B.Y + dy * (d/ds)};
	pdd PB = {B.X - dx * (d/ds), B.Y - dy * (d/ds)};
	if(dst(PA, A.S) > dst(PB, A.S)) swap(PA, PB);
	return PA;
}

line I = {{0.0, 0.0}, {1000.0, 1.0}};
vector<dot> T;
vector<pid> adj[100009];
line A[111];
int N, S, K;
double ans = 1e9, D[2][100009];
bool chk[111];

inline bool ok(line L) {
	bool f = 0;
	f |= its(L, {{S, S}, {S, -S}});
	f |= its(L, {{S, -S}, {-S, -S}});
	f |= its(L, {{-S, -S}, {-S, S}});
	f |= its(L, {{-S, S}, {S, S}});
	f |= its(L, {{S, S}, {-S, -S}});
	f |= its(L, {{-S, S}, {S, -S}});
	return !f;
}

void dijk(int st) {
	// printf("start: (%d, %d)\n", T[st].D.X, T[st].D.Y);
	for(int i=0; i<K; i++) D[0][i] = D[1][i] = 1e9;
	D[0][st] = 0.0;
	priority_queue<node> pq; pq.push({0.0, 0, st});
	while(pq.size()) {
		node n = pq.top(); pq.pop();
		if(n.id == st && n.c == 1) break;
		// printf("now: (%f, %d, (%d, %d))\n", n.v, n.c, T[n.id].D.X, T[n.id].D.Y);
		if(f(D[n.c][n.id] - n.v) > eps) continue;
		for(auto& it: adj[n.id]) {
			int tc = n.c;
			if(its({T[n.id].D, T[it.X].D}, I)) tc = 1 - tc;
			if(D[tc][it.X] > n.v + it.Y) {
				D[tc][it.X] = n.v + it.Y;
				pq.push({D[tc][it.X], tc, it.X});
			}
		}
	}
	ans = min(ans, D[1][st]);
}

void make_edge(int u, int v, double c) {
	adj[u].push_back({v, c});
	adj[v].push_back({u, c});
}

int main() {
	scanf("%d%d",&N,&S);
	for(int i=1; i<=N; i++) {
		scanf("%lf%lf%lf%lf", &A[i].S.X, &A[i].S.Y, &A[i].E.X, &A[i].E.Y);
		T.push_back({A[i].S, i, 0});
		T.push_back({A[i].E, i, 0});
	}
	T.push_back({{S, S}, N+1, 0});
	T.push_back({{S, -S}, N+2, 0});
	T.push_back({{-S, -S}, N+3, 0});
	T.push_back({{-S, S}, N+4, 0});
	for(int i=1; i<=N; i++) {
		for(int j=0; j<T.size(); j++) {
			if(i == T[j].id) continue;
			pdd pu = push(A[i], T[j].D);
			if(ok({T[j].D, pu}) && on(A[i], pu)) {
				// puts("ok");
				int u = T.size();
				T.push_back({pu, i, 1});
				make_edge(u, j, dst(pu, T[j].D));
				make_edge(u, 2*i-2, 0);
				make_edge(u, 2*i-1, 0);
			}
			// else puts("not ok");
		}
	}

	K = T.size();

	// printf("K: %d\n", K);
	// for(auto& it: T) {
	// 	printf("position(%f, %f), id: %d, pushed?: %d\n", it.D.X, it.D.Y, it.id, it.ps);
	// }

	for(int i=0; i<K; i++) {
		for(int j=i+1; j<K; j++) {
			if(!ok({T[i].D, T[j].D}) || T[i].ps || T[j].ps) continue;
			double d;
			if(T[i].id == T[j].id) d = 0;
			else d = dst(T[i].D, T[j].D);
			// printf("(%f, %f) <----> (%f, %f), cost: %f\n", T[i].D.X, T[i].D.Y, T[j].D.X, T[j].D.Y, d);
			adj[i].push_back({j, d});
			adj[j].push_back({i, d});
		}
	}

	for(int i=0; i<K; i++) {
		if(!T[i].ps) dijk(i);
		// chk[T[i].id] = 1;
	}
	printf("%.10f", ans);
	return 0;
}

Compilation message

fences.cpp: In function 'int main()':
fences.cpp:104:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0; j<T.size(); j++) {
                ~^~~~~~~~~
fences.cpp: In function 'int CCWs(pdd, pdd, pdd)':
fences.cpp:26:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
fences.cpp: In function 'int main()':
fences.cpp:93:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&N,&S);
  ~~~~~^~~~~~~~~~~~~~
fences.cpp:95:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lf%lf%lf%lf", &A[i].S.X, &A[i].S.Y, &A[i].E.X, &A[i].E.Y);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2680 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
3 Correct 4 ms 2680 KB Output is correct
4 Correct 4 ms 2680 KB Output is correct
5 Correct 4 ms 2680 KB Output is correct
6 Correct 4 ms 2684 KB Output is correct
7 Correct 4 ms 2680 KB Output is correct
8 Correct 4 ms 2680 KB Output is correct
9 Correct 4 ms 2680 KB Output is correct
10 Correct 4 ms 2680 KB Output is correct
11 Correct 4 ms 2680 KB Output is correct
12 Correct 4 ms 2680 KB Output is correct
13 Correct 4 ms 2680 KB Output is correct
14 Correct 4 ms 2680 KB Output is correct
15 Correct 4 ms 2680 KB Output is correct
16 Correct 5 ms 2680 KB Output is correct
17 Correct 4 ms 2680 KB Output is correct
18 Correct 5 ms 2812 KB Output is correct
19 Correct 4 ms 2680 KB Output is correct
20 Correct 4 ms 2680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2680 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
3 Correct 4 ms 2680 KB Output is correct
4 Correct 4 ms 2680 KB Output is correct
5 Correct 4 ms 2680 KB Output is correct
6 Correct 4 ms 2684 KB Output is correct
7 Correct 4 ms 2680 KB Output is correct
8 Correct 4 ms 2680 KB Output is correct
9 Correct 4 ms 2680 KB Output is correct
10 Correct 4 ms 2680 KB Output is correct
11 Correct 4 ms 2680 KB Output is correct
12 Correct 4 ms 2680 KB Output is correct
13 Correct 4 ms 2680 KB Output is correct
14 Correct 4 ms 2680 KB Output is correct
15 Correct 4 ms 2680 KB Output is correct
16 Correct 5 ms 2680 KB Output is correct
17 Correct 4 ms 2680 KB Output is correct
18 Correct 5 ms 2812 KB Output is correct
19 Correct 4 ms 2680 KB Output is correct
20 Correct 4 ms 2680 KB Output is correct
21 Correct 4 ms 2680 KB Output is correct
22 Correct 5 ms 2680 KB Output is correct
23 Correct 5 ms 2724 KB Output is correct
24 Correct 4 ms 2680 KB Output is correct
25 Correct 4 ms 2808 KB Output is correct
26 Correct 4 ms 2680 KB Output is correct
27 Correct 4 ms 2680 KB Output is correct
28 Correct 4 ms 2680 KB Output is correct
29 Correct 5 ms 2680 KB Output is correct
30 Correct 4 ms 2680 KB Output is correct
31 Correct 4 ms 2680 KB Output is correct
32 Correct 5 ms 2652 KB Output is correct
33 Correct 5 ms 2680 KB Output is correct
34 Correct 5 ms 2680 KB Output is correct
35 Correct 6 ms 2680 KB Output is correct
36 Correct 0 ms 2680 KB Output is correct
37 Correct 5 ms 2680 KB Output is correct
38 Correct 4 ms 2680 KB Output is correct
39 Correct 5 ms 2680 KB Output is correct
40 Correct 4 ms 2680 KB Output is correct
41 Correct 4 ms 2680 KB Output is correct
42 Correct 5 ms 2680 KB Output is correct
43 Correct 7 ms 2808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2680 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
3 Correct 4 ms 2680 KB Output is correct
4 Correct 4 ms 2680 KB Output is correct
5 Correct 4 ms 2680 KB Output is correct
6 Correct 4 ms 2684 KB Output is correct
7 Correct 4 ms 2680 KB Output is correct
8 Correct 4 ms 2680 KB Output is correct
9 Correct 4 ms 2680 KB Output is correct
10 Correct 4 ms 2680 KB Output is correct
11 Correct 4 ms 2680 KB Output is correct
12 Correct 4 ms 2680 KB Output is correct
13 Correct 4 ms 2680 KB Output is correct
14 Correct 4 ms 2680 KB Output is correct
15 Correct 4 ms 2680 KB Output is correct
16 Correct 5 ms 2680 KB Output is correct
17 Correct 4 ms 2680 KB Output is correct
18 Correct 5 ms 2812 KB Output is correct
19 Correct 4 ms 2680 KB Output is correct
20 Correct 4 ms 2680 KB Output is correct
21 Correct 4 ms 2680 KB Output is correct
22 Correct 5 ms 2680 KB Output is correct
23 Correct 5 ms 2724 KB Output is correct
24 Correct 4 ms 2680 KB Output is correct
25 Correct 4 ms 2808 KB Output is correct
26 Correct 4 ms 2680 KB Output is correct
27 Correct 4 ms 2680 KB Output is correct
28 Correct 4 ms 2680 KB Output is correct
29 Correct 5 ms 2680 KB Output is correct
30 Correct 4 ms 2680 KB Output is correct
31 Correct 4 ms 2680 KB Output is correct
32 Correct 5 ms 2652 KB Output is correct
33 Correct 5 ms 2680 KB Output is correct
34 Correct 5 ms 2680 KB Output is correct
35 Correct 6 ms 2680 KB Output is correct
36 Correct 0 ms 2680 KB Output is correct
37 Correct 5 ms 2680 KB Output is correct
38 Correct 4 ms 2680 KB Output is correct
39 Correct 5 ms 2680 KB Output is correct
40 Correct 4 ms 2680 KB Output is correct
41 Correct 4 ms 2680 KB Output is correct
42 Correct 5 ms 2680 KB Output is correct
43 Correct 7 ms 2808 KB Output is correct
44 Runtime error 260 ms 48924 KB Execution killed with signal 11 (could be triggered by violating memory limits)
45 Halted 0 ms 0 KB -