题解

18 条题解

  • 1
    @ 2026-02-20 19:05:13
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    const int FULL_CIRCLE = 360 * 3600;  // 整圈的总秒数
    const int HALF_CIRCLE = 180 * 3600;  // 180度对应的秒数,用于判断短弧
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int N;
        cin >> N;
        vector<pair<int, int>> intervals;
    
        for (int i = 0; i < N; ++i) {
            int d1, m1, s1, d2, m2, s2;
            cin >> d1 >> m1 >> s1 >> d2 >> m2 >> s2;
            
            // 度分秒统一转换为秒数
            int start = d1 * 3600 + m1 * 60 + s1;
            int end = d2 * 3600 + m2 * 60 + s2;
    
            // 计算从start顺时针到end的跨度
            int delta = (end - start + FULL_CIRCLE) % FULL_CIRCLE;
            // 若跨度超过180度,说明有效区间是反过来的短弧,交换起止点
            if (delta > HALF_CIRCLE) {
                swap(start, end);
            }
    
            // 处理区间:非跨0度直接添加,跨0度拆分为两个区间
            if (start < end) {
                intervals.emplace_back(start, end);
            } else if (start > end) {
                intervals.emplace_back(start, FULL_CIRCLE);
                intervals.emplace_back(0, end);
            }
            // start == end 时,区间跨度为0,不添加任何区间,自然处理
        }
    
        // 按区间起点排序
        sort(intervals.begin(), intervals.end());
    
        // 合并重叠/相邻的区间
        vector<pair<int, int>> merged;
        for (const auto& interval : intervals) {
            if (merged.empty()) {
                merged.push_back(interval);
            } else {
                auto& last = merged.back();
                if (interval.first <= last.second) {
                    // 重叠或相邻,合并区间,取最大终点
                    last.second = max(last.second, interval.second);
                } else {
                    merged.push_back(interval);
                }
            }
        }
    
        // 计算总覆盖秒数
        long long total = 0;
        for (const auto& p : merged) {
            total += p.second - p.first;
        }
    
        cout << total << endl;
    
        return 0;
    }
    
  • 1
    @ 2022-07-20 15:18:30
    编译通过...
    
    ├ 测试数据 01:答案正确... 0ms
    
    ├ 测试数据 02:答案正确... 0ms
    
    ├ 测试数据 03:答案正确... 0ms
    
    ├ 测试数据 04:答案正确... 0ms
    
    ├ 测试数据 05:答案正确... 0ms
    
    ├ 测试数据 06:答案正确... 0ms
    
    ├ 测试数据 07:答案正确... 306ms
    
    ├ 测试数据 08:答案正确... 0ms
    
    ---|---|---|---|---|---|---|---|-
    
    Accepted 有效得分:100 有效耗时:306ms
    
  • 0
    @ 2009-10-28 15:46:39

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    数据很猥琐

    大家注意一下

  • 0
    @ 2009-10-19 12:09:11

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    ...

    只能用 KAO 来表达我的感觉了

  • 0
    @ 2009-07-26 11:55:39

    最开始时:

    For t := s1 To s2 Do a[t] := 1;结果12分。

    修改了一下:

    For t := s1+1 To s2 Do a[t] := 1;结果88分。

    1小时后,加剪枝后AC,可惜没有秒杀。

    (加剪枝前我的程序34行,加完剪枝97行……囧)

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 306ms

    ├ 测试数据 08:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:306ms

  • 0
    @ 2009-02-11 17:43:42

    感谢梦ぁ逍遥

    其实本题就是一个快排,加一点处理!!!!!

  • 0
    @ 2008-11-05 16:54:23

    又是一个usaco chapter 1的milking cows的变形!

  • 0
    @ 2008-11-02 12:51:27

    角度难道不是从0..1296000-1吗??

    数据是0..1296000

  • 0
    @ 2008-08-13 14:38:39

    360*3600=1296000

    开这么大的数组来记录就可以了

    a为始边,b为终边,则x[a]++,x--

    ……

    注意一下跨越0度的就好了

  • 0
    @ 2007-11-14 16:03:53

    晕,难倒不是线段树?

  • 0
    @ 2007-08-27 11:01:57

    只有想不到 没有做不到

    写起来容易 如果想不到就WA了

    注意数据处理

  • 0
    @ 2007-08-17 20:33:52

    简单的离散题

  • 0
    @ 2007-08-11 21:12:32

    几何的麻烦题...难度底,程序长.

  • 0
    @ 2007-07-29 19:35:36

    难得一次前10个啊

  • 0
    @ 2007-07-29 17:55:56

    久违的新题啊!!!!

  • 0
    @ 2007-07-29 17:07:53

    忘了抢楼了......只好挖地洞

  • 0
    @ 2007-07-29 12:32:32

    设S, E为第I个视野..

    如果S>E 那么交换其位置..

    如果E-S>180*3600 那么就分成两段..

  • 0
    @ 2007-07-29 09:26:49

    …………

  • 1

信息

ID
1330
难度
8
分类
计算几何 点击显示
标签
(无)
递交数
218
已通过
32
通过率
15%
被复制
4
上传者