1+ import java .util .ArrayList ;
2+ import java .util .Arrays ;
3+ import java .util .List ;
4+
5+ public class Solution6313 {
6+ private static final int MOD = (int ) (1e9 + 7 );
7+
8+ public int countWays (int [][] ranges ) {
9+ // 连通块个数 k,答案为 2^k
10+ int k = merge (ranges );
11+ return (int ) quickPow (2 , k );
12+ }
13+
14+ private int merge (int [][] intervals ) {
15+ // start 升序 end 降序
16+ Arrays .sort (intervals , (o1 , o2 ) -> {
17+ if (o1 [0 ] == o2 [0 ]) {
18+ return Integer .compare (o2 [1 ], o1 [1 ]);
19+ }
20+ return Integer .compare (o1 [0 ], o2 [0 ]);
21+ });
22+
23+ int left = intervals [0 ][0 ];
24+ int right = intervals [0 ][1 ];
25+ List <int []> resList = new ArrayList <>();
26+ for (int i = 1 ; i < intervals .length ; i ++) {
27+ int [] interval = intervals [i ];
28+ if (left <= interval [0 ] && right >= interval [1 ]) {
29+ continue ;
30+ }
31+ if (right >= interval [0 ] && right <= interval [1 ]) {
32+ right = interval [1 ];
33+ continue ;
34+ }
35+ if (right < interval [0 ]) {
36+ resList .add (new int []{left , right });
37+ left = interval [0 ];
38+ right = interval [1 ];
39+ }
40+ }
41+ resList .add (new int []{left , right });
42+ return resList .size ();
43+ }
44+
45+ // 模下的 a^b
46+ private long quickPow (long a , long b ) {
47+ long res = 1L ;
48+ while (b > 0 ) {
49+ if ((b & 1 ) == 1 ) {
50+ res = res * a % MOD ;
51+ }
52+ a = a * a % MOD ;
53+ b >>= 1 ;
54+ }
55+ return res ;
56+ }
57+ }
58+ /*
59+ 6313. 统计将重叠区间合并成组的方案数
60+ https://leetcode.cn/problems/count-ways-to-group-overlapping-ranges/
61+
62+ 第 99 场双周赛 T3。
63+
64+ 给你一个二维整数数组 ranges ,其中 ranges[i] = [starti, endi] 表示 starti 到 endi 之间(包括二者)的所有整数都包含在第 i 个区间中。
65+ 你需要将 ranges 分成 两个 组(可以为空),满足:
66+ - 每个区间只属于一个组。
67+ - 两个有 交集 的区间必须在 同一个 组内。
68+ 如果两个区间有至少 一个 公共整数,那么这两个区间是 有交集 的。
69+ - 比方说,区间 [1, 3] 和 [2, 5] 有交集,因为 2 和 3 在两个区间中都被包含。
70+ 请你返回将 ranges 划分成两个组的 总方案数 。由于答案可能很大,将它对 109 + 7 取余 后返回。
71+ 提示:
72+ 1 <= ranges.length <= 10^5
73+ ranges[i].length == 2
74+ 0 <= starti <= endi <= 10^9
75+
76+ 合并区间 + 快速幂
77+ 问题转换为有多少个连通块 k,答案为 2^k
78+ 相似题目: 56. 合并区间
79+ https://leetcode.cn/problems/merge-intervals/
80+ 2550. 猴子碰撞的方法数
81+ https://leetcode.cn/problems/count-collisions-of-monkeys-on-a-polygon/
82+ */
0 commit comments