Submission #68491534


Source Code Expand

use std::collections::HashMap;

use proconio::input;

fn main() {
    input! {
        n: usize,
        xy: [(i32, i32); n],
    };

    // 傾きで線分を分類
    let mut segments = HashMap::new();
    for i in 0..n {
        for j in 0..i {
            let (xi, yi) = xy[i];
            let (xj, yj) = xy[j];
            let mut dy = yj - yi;
            let mut dx = xj - xi;
            let g = gcd(dy, dx);
            assert_ne!(g, 0);
            dy /= g;
            dx /= g;
            // dy/dx
            if dy.is_negative() {
                dy *= -1;
                dx *= -1;
            }
            if dy == 0 {
                assert_ne!(dx, 0);
                dx = dx.signum();
            }
            if dx == 0 {
                assert_ne!(dy, 0);
                dy = dy.signum();
            }
            segments.entry((dy, dx)).or_insert(Vec::new()).push((i, j));
        }
    }

    let mut ans = 0_usize;
    for v in segments.values() {
        ans += v.len() * (v.len() - 1) / 2;
    }

    // 平行四辺形を引く
    let mut sub = 0;
    for v in segments.into_values() {
        // 長さで線分を分類、傾きは全て同じ
        let mut seg = HashMap::new();
        for (i, j) in v {
            let (xi, yi) = xy[i];
            let (xj, yj) = xy[j];
            let dist = xi.abs_diff(xj).pow(2) + yi.abs_diff(yj).pow(2);
            *seg.entry(dist).or_insert(0) += 1;
        }
        for v in seg.into_values() {
            sub += v * (v - 1) / 2;
        }
    }
    assert_eq!(sub % 2, 0);

    ans -= sub / 2;

    println!("{}", ans);
}

fn gcd(a: i32, b: i32) -> i32 {
    if b == 0 {
        a
    } else {
        gcd(b, a % b)
    }
}

Submission Info

Submission Time
Task E - Trapezium
User ikd
Language Rust (rustc 1.70.0)
Score 475
Code Size 1782 Byte
Status AC
Exec Time 1128 ms
Memory 348000 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 2
AC × 28
Set Name Test Cases
Sample 00-sample-01.txt, 00-sample-02.txt
All 00-sample-01.txt, 00-sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt
Case Name Status Exec Time Memory
00-sample-01.txt AC 1 ms 1896 KiB
00-sample-02.txt AC 1 ms 2048 KiB
01-01.txt AC 1 ms 1960 KiB
01-02.txt AC 30 ms 12660 KiB
01-03.txt AC 688 ms 196632 KiB
01-04.txt AC 332 ms 101660 KiB
01-05.txt AC 927 ms 348000 KiB
01-06.txt AC 934 ms 347860 KiB
01-07.txt AC 141 ms 47924 KiB
01-08.txt AC 140 ms 47356 KiB
01-09.txt AC 135 ms 46360 KiB
01-10.txt AC 102 ms 37748 KiB
01-11.txt AC 91 ms 34280 KiB
01-12.txt AC 922 ms 205208 KiB
01-13.txt AC 950 ms 213484 KiB
01-14.txt AC 706 ms 174848 KiB
01-15.txt AC 699 ms 174904 KiB
01-16.txt AC 1121 ms 347956 KiB
01-17.txt AC 1106 ms 347888 KiB
01-18.txt AC 731 ms 186288 KiB
01-19.txt AC 727 ms 186340 KiB
01-20.txt AC 732 ms 186388 KiB
01-21.txt AC 722 ms 186292 KiB
01-22.txt AC 922 ms 347948 KiB
01-23.txt AC 943 ms 196488 KiB
01-24.txt AC 1128 ms 347876 KiB
01-25.txt AC 994 ms 212520 KiB
01-26.txt AC 1092 ms 347956 KiB