Task: | Line Segment Intersection |
Sender: | minghao |
Submission time: | 2024-11-13 19:16:54 +0200 |
Language: | C++ (C++20) |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.22 s | details |
#2 | ACCEPTED | 0.23 s | details |
#3 | ACCEPTED | 0.25 s | details |
#4 | ACCEPTED | 0.26 s | details |
#5 | ACCEPTED | 0.00 s | details |
#6 | ACCEPTED | 0.00 s | details |
Compiler report
input/code.cpp: In function 'void Test()': input/code.cpp:128:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result] 128 | freopen("temp\\in.txt", "r", stdin); | ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~ input/code.cpp: In member function 'void Point::Input()': input/code.cpp:19:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result] 19 | scanf("%lld%lld", &x_, &y_); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Code
#include <bits/stdc++.h>typedef long long LL;using namespace std;inline int Sign(const LL& x){if(x == 0) return 0;if(x < 0) return -1;else return 1;}struct Point{LL x_, y_;Point(){}Point(LL x, LL y): x_(x), y_(y) {}void Input() {scanf("%lld%lld", &x_, &y_);}void Output() {printf("%lld %lld", x_, y_);}bool operator == (const Point& P) const {return Sign(x_ - P.x_) == 0 && Sign(y_ - P.y_) == 0;}bool operator < (const Point& P) const {return Sign(x_ - P.x_) == 0? Sign(y_ - P.y_)<0 : x_<P.x_;}LL operator ^ (const Point& P) const {return x_*P.y_ - y_*P.x_;}LL operator * (const Point& P) const {return x_*P.x_ + y_*P.y_;}Point operator + (const Point& P) const {return Point(x_+P.x_, y_+P.y_);}Point operator - (const Point& P) const {return Point(x_-P.x_, y_-P.y_);}Point operator * (const LL& k) const {return Point(x_*k, y_*k);}Point operator / (const LL& k) const {return Point(x_/k, y_/k);}LL len() {return hypot(x_, y_);}LL dis(Point P) {return hypot(x_ - P.x_, y_ - P.y_);}Point Trunc(LL r){LL l = len();if(!Sign(l)) return *this;r /= l;return Point(x_*r, y_*r);}// Point Rotate(Point p, LL angle)// {// Point v = (*this) - p;// LL c = cos(angle), s = sin(angle);// return Point(p.x_ + c*v.x_ - s*v.y_, p.y_ + s*v.x_ + c*v.y_);// }};struct Line{Point u_, v_;Line(){}Line(Point u, Point v): u_(u), v_(v) {}// Line(Point p, LL angle)// {// u_ = p;// if(Sign(angle - PI/2) == 0) {// v_ = (u_ + Point(0, 1));// } else {// v_ = (u_ + Point(1, tan(angle)));// }// }LL len() {return u_.dis(v_);}// LL ang() {// LL k = atan2(v_.y_ - u_.y_, v_.x_ - u_.x_);// if(Sign(k) < 0) k += PI;// if(Sign(k - PI) == 0) k -= PI;// return k;// }bool OnSeg(Point p) {return Sign((p - u_)^(v_ - u_)) == 0 && Sign((p - u_)*(p - v_)) <= 0;}// 0(On) 2(R) 1(L)int Relation(Point p){int c = Sign((p - u_)^(v_ - u_));if(c < 0) return 1;else if(c > 0) return 2;else return 0;}// 2(true) 1(false) 0 (no)int SegCrossSeg(Line l){int d1 = Sign((v_ - u_)^(l.u_ - u_));int d2 = Sign((v_ - u_)^(l.v_ - u_));int d3 = Sign((l.v_ - l.u_)^(u_ - l.u_));int d4 = Sign((l.v_ - l.u_)^(v_ - l.u_));if((d1^d2) == -2 && (d3^d4) == -2) return 2;return (d1 == 0 && Sign((l.u_ - u_)*(l.u_ - v_)) <= 0) ||(d2 == 0 && Sign((l.v_ - u_)*(l.v_ - v_)) <= 0) ||(d3 == 0 && Sign((u_ - l.u_)*(u_ - l.v_)) <= 0) ||(d4 == 0 && Sign((v_ - l.u_)*(v_ - l.v_)) <= 0);}};void Test(){freopen("temp\\in.txt", "r", stdin);}int main(){// Test();int n;cin >> n;Line A, B;while(n--){A.u_.Input();A.v_.Input();B.u_.Input();B.v_.Input();if(A.SegCrossSeg(B))cout << "YES" << endl;elsecout << "NO" << endl;}return 0;}
Test details
Test 1
Verdict: ACCEPTED
input |
---|
100000 9 7 1 8 8 -5 0 2 10 1 -1 2 -4 1 -7 3 10 2 -8 6 1 2 2 -1 -10 1 9 -7 4 -3 -5 0 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 2
Verdict: ACCEPTED
input |
---|
100000 81 745 -967 768 -451 -490 -454... |
correct output |
---|
NO NO YES NO YES ... |
user output |
---|
NO NO YES NO YES ... Truncated |
Test 3
Verdict: ACCEPTED
input |
---|
100000 492853 -452834 -657156 -282543... |
correct output |
---|
YES YES NO YES YES ... |
user output |
---|
YES YES NO YES YES ... Truncated |
Test 4
Verdict: ACCEPTED
input |
---|
100000 788522666 939776556 -831492125... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 5
Verdict: ACCEPTED
input |
---|
1 1 6 6 6 4 4 1000000000 1000000... |
correct output |
---|
YES |
user output |
---|
YES |
Test 6
Verdict: ACCEPTED
input |
---|
1 -1000000000 1000000000 9999999... |
correct output |
---|
NO |
user output |
---|
NO |