fork(1) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. long long Ax, Ay, Bx, By, Cx, Cy, Dx, Dy;
  6. scanf("%lld%lld%lld%lld%lld%lld%lld%lld", &Ax, &Ay, &Bx, &By, &Cx, &Cy, &Dx, &Dy);
  7. long long minX = max(min(Ax, Bx), min(Cx, Dx));
  8. long long minY = max(min(Ay, By), min(Cy, Dy));
  9. long long maxX = min(max(Ax, Bx), max(Cx, Dx));
  10. long long maxY = min(max(Ay, By), max(Cy, Dy));
  11. if ((minX > maxX) || (minY > maxY)) { // Не пересекаются проекции
  12. printf("No\n");
  13. } else {
  14. if (((Ay - By) * Cx + (Bx - Ax) * Cy == Ay * Bx - Ax * By) && ((Ay - By) * Dx + (Bx - Ax) * Dy == Ay * Bx - Ax * By)) {
  15. printf("Yes\n"); // На одной прямой
  16. } else { // координаты пересечения в виде рациональной дроби..
  17. long long xn = (Ay * Bx - Ax * By) * (Dx - Cx) - (Cy * Dx - Cx * Dy) * (Bx - Ax);
  18. long long xd = (xn == 0)? 1: (Ay - By) * (Dx - Cx) - (Bx - Ax) * (Cy - Dy);
  19. long long yn = (Ay * Bx - Ax * By) * (Cy - Dy) - (Cy * Dx - Cx * Dy) * (Ay - By);
  20. long long yd = (yn == 0)? 1: (Bx - Ax) * (Cy - Dy) - (Ay - By) * (Dx - Cx);
  21. // ... с положительным знаменателем
  22. if (xd < 0) {
  23. xd = -xd; xn = -xn;
  24. }
  25. if (yd < 0) {
  26. yd = -yd; yn = -yn;
  27. }
  28. // Попадает на пересечение проекций?
  29. printf(((minX * xd <= xn) && (xn <= maxX * xd) && (minY * yd <= yn) && (yn <= maxY * yd))? "Yes\n": "No\n");
  30. }
  31. }
  32. return 0;
  33. }
Success #stdin #stdout 0s 3348KB
stdin
1 5 
5 5 
5 5 
6 8
stdout
Yes