題解/算法 {2580. 统计将重叠区间合并成组的方案数}

Solution

Link

给定 n n n个区间 [ l , r ] [l, r] [l,r], 你需要将他们放到不同的并查集里, 且满足: 只要两个区间是相交的 他们必须处在同一个并查集里!
. 另个角度说, 我们将这 n n n个区间当做是 n n n个点, 如果两个区间是相交的 就连接一条无向边, 最终, 求有多少个’连通图’;

注意我们要用 O ( n ) O(n) O(n)的时间, 虽然最多是有 O ( n 2 ) O(n^2) O(n2)条边, 但我们最终的目的 就是求有多少个连通图, 或者更精确的说 我们就是要将他们放到一个’并查集’里 (比如 n n n个点在同一个并查集 虽然有 n 2 n^2 n2条边, 但我们其实用 O ( n ) O(n) O(n)的时间 就可以将他们放到一个并查集里)

@Delimiter

对区间按照 l l l 从小到大排序, 然后使用双指针;

对于当前 i i i区间, 我们只关注 所有 > i > i >i的区间 能与他相交的 (对于 < i <i <i且与他相交的, 不在这里处理, 而是在 < i <i <i那处理)
. 此时有一个性质, 令 r > i r > i r>i为第一个不相交的区间, 那么 [ i + 1 , . . . , r ) [i+1,..., r) [i+1,...,r)都与当前区间相交, 而 [ r , r + 1 , . . . ] [r, r+1, ...] [r,r+1,...]均不相交;
. 注意, i i i r r r不相交, 虽然 i i i i + 1 i+1 i+1相交, 但是 i + 1 i+1 i+1可能与 r r r相交; 总之就是双指针;

Code

pair< int, int> A[N];
sort( A, A + N);
DisjointSet S( N, N);
int r = 1;
for( int l = 0; l < N; ++l){
    while( r < n && ( A[ r].first <= A[ l].second)){
        S.Merge( l, r);
        ++ r;
    }
}
`N - S.Get_mergedTimes()` = 并查集的个数;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值