提出 #72189581


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;

// 计算两个线段是否相交
bool doIntersect(pll p1, pll p2, pll q1, pll q2) {
    auto cross = [](pll a, pll b, pll c) -> ll {
        return (b.first - a.first) * (c.second - a.second) - (b.second - a.second) * (c.first - a.first);
    };
    
    ll d1 = cross(p1, p2, q1);
    ll d2 = cross(p1, p2, q2);
    ll d3 = cross(q1, q2, p1);
    ll d4 = cross(q1, q2, p2);
    
    // 如果线段相交或端点重合,则不能同时放风筝
    if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && 
        ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {
        return true;
    }
    
    // 检查端点是否在线段上
    if (d1 == 0 && min(p1.first, p2.first) <= q1.first && q1.first <= max(p1.first, p2.first) &&
        min(p1.second, p2.second) <= q1.second && q1.second <= max(p1.second, p2.second)) {
        return true;
    }
    
    if (d2 == 0 && min(p1.first, p2.first) <= q2.first && q2.first <= max(p1.first, p2.first) &&
        min(p1.second, p2.second) <= q2.second && q2.second <= max(p1.second, p2.second)) {
        return true;
    }
    
    if (d3 == 0 && min(q1.first, q2.first) <= p1.first && p1.first <= max(q1.first, q2.first) &&
        min(q1.second, q2.second) <= p1.second && p1.second <= max(q1.second, q2.second)) {
        return true;
    }
    
    if (d4 == 0 && min(q1.first, q2.first) <= p2.first && p2.first <= max(q1.first, q2.first) &&
        min(q1.second, q2.second) <= p2.second && p2.second <= max(q1.second, q2.second)) {
        return true;
    }
    
    return false;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    ll N;
    cin >> N;
    vector<pll> points(N);
    for (ll i = 0; i < N; i++) {
        cin >> points[i].first >> points[i].second;
    }
    
    // 贪心算法:按某种顺序选择尽可能多的不冲突的风筝
    // 使用图论方法:构建冲突图,然后求最大独立集
    
    // 由于N很大,不能构建完整的图
    // 转换思路:将问题转化为区间调度问题
    
    // 计算每条线段的斜率和截距,用于快速判断相交
    vector<pair<double, ll>> slopes(N);
    for (ll i = 0; i < N; i++) {
        // 线段从(Ai, 0)到(Bi, 1),斜率为1/(Bi-Ai)
        // 为了便于比较,我们使用Ai-Bi作为排序依据
        slopes[i] = {points[i].second - points[i].first, i};
    }
    
    // 按斜率排序
    sort(slopes.begin(), slopes.end());
    
    // 贪心选择:选择尽可能多的不相交线段
    vector<bool> used(N, false);
    ll count = 0;
    
    for (ll i = 0; i < N; i++) {
        ll idx = slopes[i].second;
        if (used[idx]) continue;
        
        bool conflict = false;
        // 检查与已选线段是否冲突
        for (ll j = 0; j < i; j++) {
            ll prev_idx = slopes[j].second;
            if (used[prev_idx]) {
                // 检查线段是否相交
                pll p1 = {points[idx].first, 0};
                pll p2 = {points[idx].second, 1};
                pll q1 = {points[prev_idx].first, 0};
                pll q2 = {points[prev_idx].second, 1};
                
                if (doIntersect(p1, p2, q1, q2)) {
                    conflict = true;
                    break;
                }
            }
        }
        
        if (!conflict) {
            used[idx] = true;
            count++;
        }
    }
    
    cout << count << endl;
    return 0;
}

提出情報

提出日時
問題 E - Kite
ユーザ stone_shadow
言語 C++23 (GCC 15.2.0)
得点 0
コード長 3628 Byte
結果 WA
実行時間 > 2000 ms
メモリ 9688 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 0 / 450
結果
AC × 2
WA × 1
AC × 7
WA × 9
TLE × 8
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_1_00.txt, 01_random_1_01.txt, 01_random_1_02.txt, 01_random_1_03.txt, 01_random_1_04.txt, 01_random_1_05.txt, 02_random_2_00.txt, 02_random_2_01.txt, 02_random_2_02.txt, 02_random_2_03.txt, 02_random_2_04.txt, 02_random_2_05.txt, 03_sorted_00.txt, 03_sorted_01.txt, 03_sorted_02.txt, 03_sorted_03.txt, 03_sorted_04.txt, 03_sorted_05.txt, 04_same_coord_00.txt, 04_same_coord_01.txt, 04_same_coord_02.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3640 KiB
00_sample_01.txt AC 1 ms 3548 KiB
00_sample_02.txt WA 1 ms 3636 KiB
01_random_1_00.txt WA 21 ms 7104 KiB
01_random_1_01.txt WA 37 ms 9560 KiB
01_random_1_02.txt WA 30 ms 8472 KiB
01_random_1_03.txt WA 36 ms 9532 KiB
01_random_1_04.txt WA 35 ms 9540 KiB
01_random_1_05.txt WA 35 ms 9580 KiB
02_random_2_00.txt TLE > 2000 ms 9396 KiB
02_random_2_01.txt TLE > 2000 ms 9420 KiB
02_random_2_02.txt TLE > 2000 ms 9524 KiB
02_random_2_03.txt TLE > 2000 ms 9688 KiB
02_random_2_04.txt TLE > 2000 ms 9556 KiB
02_random_2_05.txt TLE > 2000 ms 9688 KiB
03_sorted_00.txt TLE > 2000 ms 9660 KiB
03_sorted_01.txt AC 37 ms 9688 KiB
03_sorted_02.txt WA 84 ms 9660 KiB
03_sorted_03.txt TLE > 2000 ms 9480 KiB
03_sorted_04.txt AC 36 ms 9552 KiB
03_sorted_05.txt WA 104 ms 9552 KiB
04_same_coord_00.txt AC 37 ms 9548 KiB
04_same_coord_01.txt AC 36 ms 9420 KiB
04_same_coord_02.txt AC 22 ms 9536 KiB