# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
4140 | pl0892029 | Jogging (kriii1_J) | C++98 | 96 ms | 4044 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef struct point {
int x,y;
}point;
bool cmp(point a,point b) {
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
point star[100000], DEQ[100000];
int Mx[100000];
double Mans[100000];
int main() {
int n, m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++) {
int x, y;
scanf("%d %d",&x,&y);
star[i].x=x;
star[i].y=y;
}
sort(star,star+n,cmp);
for(int i=0;i<m;i++)
scanf("%d",Mx+i);
int currentPoint = n-1;
int front = 0, rear = -1;
for(int i=m-1;i>=0;i--) {
for( ; currentPoint >= 0 && Mx[i] < star[currentPoint].x; currentPoint--) {
while( front <= rear ) {
if( DEQ[rear].y <= star[currentPoint].y )
rear--;
else
break;
}
++rear;
DEQ[rear].x = star[currentPoint].x;
DEQ[rear].y = star[currentPoint].y;
}
while( front < rear ) {
if( (long long)DEQ[front+1].y*(DEQ[front].x-DEQ[front+1].x) <= (long long)(DEQ[front].y-DEQ[front+1].y)*(DEQ[front+1].x-Mx[i]) ) {
DEQ[front+1].x = DEQ[front].x;
DEQ[front+1].y = DEQ[front].y;
front++;
}
else
break;
}
if( rear < front )
Mans[i] = 0;
else
Mans[i] = atan2((double)DEQ[rear].y,(double)(DEQ[rear].x-Mx[i]));
}
for(int i=0;i<m;i++)
printf("%.7lf\n",Mans[i]);
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |