1 // CALCULAR EL MINIMO ANGULO PARA EL ARMA QUE CON HASTA K TIROS MATA A TODOS
2 // LOS SEGMENTOS; ( FANTASMITAS :P ES COMO GHOSTBUSTERS :P )
17 double M
= 2*acos(-1);
20 double angulo(point p
){
21 double d
= sqrt(p
.x
*p
.x
+p
.y
*p
.y
);
24 double angle
= acos(p
.x
);
25 if( p
.y
+ EPS
< 0.0 ) angle
= 2.0*PI
-angle
;
28 pair
<double,double> inter(segment seg
){
29 return make_pair(angulo(seg
.p1
), angulo(seg
.p2
));
31 int borrar(vector
<pair
<double,double> > &vec
){
32 if( vec
.size() == 1 ) return 0;
33 for(int i
=0;i
<vec
.size();i
++){
34 if( fabs(vec
[i
].first
-vec
[i
].second
) < EPS
){
35 vec
.erase(vec
.begin()+i
);
38 int next
= (i
+1)%vec
.size();
40 if( vec
[next
].first
< vec
[i
].second
){
41 vec
[i
].second
= max(vec
[i
].second
, vec
[next
].second
);
42 vec
.erase(vec
.begin()+next
);
46 pair
<double, double> par
= vec
[next
];
47 par
.first
+=2.0*PI
, par
.second
+=2.0*PI
;
48 if( par
.first
< vec
[i
].second
){
49 vec
[i
].second
= max(vec
[i
].second
, par
.second
);
50 vec
.erase(vec
.begin()+next
);
57 int tratar(vector
<pair
<double, double> > vec
, int ind
, double dist
){
59 double last
= vec
[ind
].first
;
68 if( i
== 0 && last
> M
){
69 while(last
> M
)last
-= M
;
70 }else if( i
== 0 ) last
= 0.0;
72 pri
= max(vec
[i
].first
, last
);
75 double len
= ((sec
-pri
)/dist
);
77 if( fabs(len
-floor(len
+EPS
)) < EPS
) ca
= (int)(len
+EPS
);
78 else ca
= (int)(len
+EPS
)+1;
80 last
= pri
+dist
*(double)ca
;
86 int cantidad(double dist
, vector
<pair
<double, double> > vec
){
89 for(i
=0;i
<vec
.size();i
++) res
= min(tratar(vec
, i
, dist
), res
);
94 int casos
;scanf("%i", &casos
);
97 for(int h
= 0 ; h
< casos
;h
++){
98 scanf("%i %i", &n
, &K
);
100 scanf("%lf %lf", &x
, &y
);
101 for(i
=0;i
<n
;i
++)scanf("%lf %lf %lf %lf", &seg
[i
].p1
.x
, &seg
[i
].p1
.y
, &seg
[i
].p2
.x
, &seg
[i
].p2
.y
);
108 vector
<pair
<double,double> > intervalo
;
109 for(i
=0;i
<n
;i
++) intervalo
.push_back(inter(seg
[i
]));
110 for(i
=0;i
<intervalo
.size();i
++){
111 if( intervalo
[i
].first
< intervalo
[i
].second
){
112 if( intervalo
[i
].second
-intervalo
[i
].first
> PI
)
113 swap(intervalo
[i
].first
, intervalo
[i
].second
);
115 if( intervalo
[i
].first
-intervalo
[i
].second
< PI
)
116 swap(intervalo
[i
].first
, intervalo
[i
].second
);
119 for(i
=0;i
<intervalo
.size();i
++) if( intervalo
[i
].first
> EPS
+intervalo
[i
].second
){
120 intervalo
[i
].second
+= 2.0*PI
;
122 sort(intervalo
.begin(), intervalo
.end());
123 while(borrar(intervalo
));
125 for(i
=0;i
<intervalo
.size();i
++)
126 tot
+=intervalo
[i
].second
-intervalo
[i
].first
;
129 if( fabs(tot
-M
) < EPS
){
130 if( K
== 1 ) res
= -1.0;
131 else res
= M
/ (double) K
;
136 if( cantidad(e
, intervalo
) > K
) res
= -1.0;
137 else if( cantidad(b
,intervalo
) <= K
)res
= b
;
139 while( fabs( b
-e
) > EPS
/2.0 ){
140 double med
= (b
+e
)/2.0;
141 if( cantidad(med
, intervalo
) <= K
){
149 res
= (res
/PI
)*180.0;
152 printf("%.4lf\n", res
);