Submission #4169

#TimeUsernameProblemLanguageResultExecution timeMemory
4169pl0892029Jogging (kriii1_J)C++98
0 / 1
100 ms4044 KiB
#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 j = n-1; int front = 0, rear = -1; for(int i=m-1;i>=0;i--) { for( ; j >= 0 && Mx[i] < star[j].x; j--) { while( front <= rear ) { if( DEQ[rear].y <= star[j].y ) rear--; else break; } while( front < rear ) { if( (long long)(DEQ[rear].y-star[j].y)*(DEQ[rear-1].x-star[j].x) <= (long long)(DEQ[rear-1].y-star[j].y)*(DEQ[rear].x-star[j].x) ) { rear--; } else break; } ++rear; DEQ[rear].x = star[j].x; DEQ[rear].y = star[j].y; } while( front < rear ) { if( (long long)DEQ[front+1].y*(DEQ[front].x-Mx[i]) <= (long long)DEQ[front].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 timeMemoryGrader output
Fetching results...