mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
596be6ae11
5000-5099
147 lines
3.8 KiB
C++
147 lines
3.8 KiB
C++
#include<cstdio>
|
|
#include<cstring>
|
|
#include<vector>
|
|
#include<queue>
|
|
#include<cmath>
|
|
#include<cctype>
|
|
#include<string>
|
|
#include<algorithm>
|
|
#include<iostream>
|
|
#include<ctime>
|
|
#include<map>
|
|
#include<set>
|
|
using namespace std;
|
|
#define MP(x,y) make_pair((x),(y))
|
|
#define PB(x) push_back(x)
|
|
typedef __int64 LL;
|
|
const int INF = 1000111222;
|
|
const double INFF = 1e100;
|
|
const double eps = 1e-8;
|
|
const int mod = 1000000007;
|
|
const int NN = 100010;
|
|
const int MM = 400010;
|
|
struct node
|
|
{
|
|
double h;
|
|
double x;
|
|
bool operator<(const node &tt)const
|
|
{
|
|
return x < tt.x;
|
|
}
|
|
}a[NN];
|
|
struct Q
|
|
{
|
|
int l,r,id;
|
|
double x;
|
|
bool operator<(const Q &tt)const
|
|
{
|
|
return x < tt.x;
|
|
}
|
|
}line[NN];
|
|
int q[NN];
|
|
double ans[NN];
|
|
const double pi = acos(-1.0);
|
|
int main()
|
|
{
|
|
int cas, ee = 0;
|
|
int i, n, m, j, j1, j2, tail;
|
|
double t, t1, t2;
|
|
scanf("%d", &cas);
|
|
while (cas--)
|
|
{
|
|
scanf("%d",&n);
|
|
for (i = 1; i <= n; i ++)
|
|
{
|
|
scanf("%lf%lf", &a[i].x, &a[i].h);
|
|
}
|
|
sort(a+1, a+1+n);
|
|
scanf("%d", &m);
|
|
for (i = 1; i <= m; i ++)
|
|
{
|
|
scanf("%lf", &line[i].x);
|
|
line[i].id = i;
|
|
}
|
|
sort(line+1, line+1+m);
|
|
q[tail = 1] = 1;
|
|
j = 2;
|
|
for (i = 1; i <= m; i ++)
|
|
{
|
|
while (j <= n && a[j].x < line[i].x)
|
|
{
|
|
while (tail > 0 && a[j].h >= a[ q[tail] ].h)
|
|
tail--;
|
|
while (tail > 1)
|
|
{
|
|
j2 = q[tail-1];
|
|
j1 = q[tail];
|
|
if( (a[j1].h - a[j].h) * (a[j1].x - a[j2].x) <=
|
|
(a[j2].h-a[j1].h) * (a[j].x - a[j1].x) )
|
|
tail--;
|
|
else
|
|
break;
|
|
}
|
|
q[++tail] = j;
|
|
j++;
|
|
}
|
|
while (tail > 1)
|
|
{
|
|
j1 = q[tail-1];
|
|
j2 = q[tail];
|
|
if(a[j1].h/(line[i].x - a[j1].x) >=
|
|
a[j2].h/(line[i].x - a[j2].x))
|
|
tail--;
|
|
else
|
|
break;
|
|
}
|
|
line[i].l = q[tail];
|
|
}
|
|
q[tail = 1] = n;
|
|
j = n-1;
|
|
for (i = m; i >= 1; i --)
|
|
{
|
|
while (j >= 1 && a[j].x > line[i].x)
|
|
{
|
|
while (tail > 0 && a[j].h >= a[ q[tail] ].h)
|
|
tail--;
|
|
while (tail > 1)
|
|
{
|
|
j1 = q[tail];
|
|
j2 = q[tail-1];
|
|
if( (a[j1].h - a[j].h) * (a[j2].x - a[j1].x) <=
|
|
(a[j2].h-a[j1].h) * (a[j1].x - a[j].x) )
|
|
tail--;
|
|
else
|
|
break;
|
|
}
|
|
q[++tail] = j;
|
|
j--;
|
|
}
|
|
while (tail > 1)
|
|
{
|
|
j1 = q[tail-1];
|
|
j2 = q[tail];
|
|
if(a[j1].h/(a[j1].x - line[i].x) >=
|
|
a[j2].h/(a[j2].x - line[i].x))
|
|
tail--;
|
|
else
|
|
break;
|
|
}
|
|
line[i].r = q[tail];
|
|
}
|
|
for (i = 1; i <= m; i ++)
|
|
{
|
|
t1 = a[ line[i].l ].h/( line[i].x - a[ line[i].l ].x + 0.0 );
|
|
t2 = a[ line[i].r ].h/( line[i].x - a[ line[i].r ].x + 0.0 );
|
|
t2 = -t2;
|
|
t = pi - atan(t1) - atan(t2);
|
|
ans[ line[i].id ] = t*180.0/pi;
|
|
}
|
|
printf("Case #%d:\n", ++ee);
|
|
for (i = 1; i <= m; i ++)
|
|
{
|
|
printf("%.10lf\n", ans[i]);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|