CSES - Aalto Competitive Programming 2024 - wk10 - Homework - Results
Submission details
Task:Line Segment Intersection
Sender:HFalke
Submission time:2024-11-08 01:07:19 +0200
Language:C++ (C++17)
Status:READY
Result:
Test results
testverdicttime
#10.08 sdetails
#2ACCEPTED0.09 sdetails
#3ACCEPTED0.11 sdetails
#4ACCEPTED0.12 sdetails
#50.00 sdetails
#6ACCEPTED0.00 sdetails

Code

#include <bits/stdc++.h>

using namespace std;

//Definitions for quicker writing
#define REP(i,a,b) for (int i = a; i < b; i++)
#define clz __builtin_clz
#define ctz __builtin_ctz
#define popct __builtin_popcount
#define PB push_back
#define MP make_pair
#define F first
#define S second
#define X real()
#define Y imag()

//Typedefs for quicker writing
typedef long long ll;
typedef vector<int> vi;
typedef vector<long long> vl;
typedef pair<int,int> pi;
typedef pair<long long, long long> pl;
typedef complex<long long> po;

//Max values
const long long lmx = LLONG_MAX;
const int imx = INT_MAX;

ll cross(po v, po w){
    return v.X * w.Y - v.Y * w.X;
}

//Is c between a and b?
bool between(po a,po b,po c){
    return c.X <= max(a.X,b.X) && c.X >= min(a.X,b.X) && c.Y <= max(a.Y,b.Y) && c.Y >= min(a.Y,b.Y);
}

int main() {
	//IO optimization
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	//Input definition
	ll n;

	//Read In
	cin >> n;

    po tests[n][4];
    ll x;
    ll y;
    REP(i,0,n){
        REP(j,0,4){
            cin >> x >> y;
            tests[i][j] = {x,y};
        }
    }

	//Main part
    vector<bool> res(n,false);
    po a;
    po b;
    po c;
    po d;
	REP(i,0,n){
        //Quicker Writing
        a = tests[i][0];
        b = tests[i][1];
        c = tests[i][2];
        d = tests[i][3];

        //First case:
        if(cross(b-a,d-c) == 0 && cross(c-a,c-b) == 0 && cross(d-a,d-b) == 0){
            if(between(a,b,c) || between(a,b,d) || between(c,d,a) || between(c,d,b)){
                res[i] = true;
                continue;
            }
        }

        //Second case:
        if ((a==c) || (b==c) || (a==d) || (b==d)){
            res[i] = true;
            continue;
        }

        //Third case:
        if(((cross(c-a,c-b) > 0 && cross(d-a,d-b) < 0) ||
            (cross(c-a,c-b) < 0 && cross(d-a,d-b) > 0)) &&
           ((cross(a-c,a-d) > 0 && cross(b-c,b-d) < 0) || 
            (cross(a-c,a-d) < 0 && cross(b-c,b-d) > 0 ))){
            res[i] = true;
        }
    }
	
	//Write out
    REP(i,0,n){
        cout << (res[i] ? "YES" : "NO") << "\n";
    }
		
	//Return
	return 0;

}

Test details

Test 1

Verdict:

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
...

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
...

Test 3

Verdict: ACCEPTED

input
100000
492853 -452834 -657156 -282543...

correct output
YES
YES
NO
YES
YES
...

user output
YES
YES
NO
YES
YES
...

Test 4

Verdict: ACCEPTED

input
100000
788522666 939776556 -831492125...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 5

Verdict:

input
1
1 6 6 6 4 4 1000000000 1000000...

correct output
YES

user output
NO

Test 6

Verdict: ACCEPTED

input
1
-1000000000 1000000000 9999999...

correct output
NO

user output
NO