1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| #include <bits/stdc++.h> #define int long long #define endl '\n' #define ff double using namespace std;
const int N = 2e5 + 7; const ff eps = 1e-9; ff x[N], y[N]; struct point { ff x,y; }; bool pointInBox(point a,point b,point p) { ff minx = min(a.x,b.x), maxx = max(a.x,b.x); ff miny = min(a.y,b.y), maxy = max(a.y,b.y); return p.x >= minx && p.x <= maxx && p.y >= miny && p.y <= maxy; } struct sgt{ point p1,p2; bool contains(point &p) { return pointInBox(p1,p2,p); } }; struct line { double a,b,c; line(ff a = 0,ff b = 0, ff c = 0) : a(a), b(b), c(c) {} }; line getLine(ff x1, ff y1, ff x2, ff y2) { return line(y2 - y1, x1 - x2, y1 *(x2 - x1) - x1 * (y2 - y1)); } line getLine(point p,point q) { return getLine(p.x,p.y,q.x,q.y); } point getinter(line p,line q) { point pi; pi.x = (q.c * p.b - p.c * q.b) / ( p.a * q.b - q.a * p.b); pi.y = (q.c * p.a - p.c * q.a) / (p.b * q.a - q.b * p.a); return pi; } ff cp(point a,point b,point c) { return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x); } point pi; bool ininter(sgt s1, sgt s2) { line p = getLine(s1.p1,s1.p2), q = getLine(s2.p1,s2.p2); if (fabs(p.a * q.b - q.a * p.b) < eps) { if (fabs(cp(s1.p1,s1.p2,s2.p1)) < eps) { return s1.contains(s2.p1) || s1.contains(s2.p2); return false; } } pi = getinter(p,q); return s1.contains(pi); } vector<point>num[N]; point st; ff dist(point a,point b) { ff dx = a.x - b.x, dy = a.y - b.y; return sqrt(dx * dx + dy * dy); } bool cmp(point a, point b) { return dist(a,st) < dist(b,st); }
signed main() { int n, m; cin >> n >> m; ff sx, sy, tx, ty; cin >> sx >> sy >> tx >> ty; line star = getLine({sx,sy},{tx,ty}); sgt start = {{sx,sy},{tx,ty}}; st = {sx,sy}; for(int i = 1; i <= n; i++) { cin >> x[i] >> y[i]; }
for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) continue; sgt now = {{x[i],y[i]},{x[j],y[j]}}; if (ininter(start,now)) { num[i].push_back({pi}); } } } for (int i = 1; i <= n; ++ i ) { sort(num[i].begin(), num[i].end(), cmp); } while(m--) { int x, y; cin >> x >> y; if(num[x].size() < y) cout << -1 << endl; else printf("%.7lf %.7lf\n", num[x][y - 1].x, num[x][y - 1].y); } return 0; }
|