CSES - Aalto Competitive Programming 2024 - wk10 - Homework - Results
Submission details
Task:Line Segment Intersection
Sender:HFalke
Submission time:2024-11-07 18:14:09 +0200
Language:C++ (C++17)
Status:READY
Result:
Test results
testverdicttime
#10.08 sdetails
#2ACCEPTED0.10 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 (conj(v)*w).Y;
}

int main() {
	//IO optimization
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	//Input definition
	int 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){
        //Dont wanna write tests[x][y] everytime
        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){
            if((max(a.X,b.X) >= min(c.X,d.X)) &&
               (min(a.X,b.X) <= max(c.X,d.X)) &&
               (max(a.Y,b.Y) >= min(c.Y,d.Y)) && 
               (min(a.Y,b.Y) <= max(c.Y,d.Y))){
                res[i] = true;
                continue;
            }
        }

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

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