18 条题解
-
1
搬运工 (syrth0p1) LV 10 @ 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