算法 {有关区间的问题}

文章探讨了多种与区间处理相关的算法问题,包括01数组维护连续元素、动态区间覆盖、点的最大区间覆盖、区间合并、区间最大覆盖以及区间选点的最大匹配等。特别地,提到了使用并查集解决区间相交问题的方法,以及如何计算相交区间形成的连通图数量。
摘要由CSDN通过智能技术生成

算法 {有关区间的问题}

最小次操作(A[l...r]+=Delta)使得数组所有值相同

@LINK: https://editor.csdn.net/md/?articleId=137930542; @LOC_0;

01数组维护连续元素(维护区间合并与删除)

@LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=134647221

动态区间覆盖

@LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=134398770;

点的最大区间覆盖

@LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=134350742;

区间合并

@LINK: https://editor.csdn.net/md/?articleId=132841464;

区间最大覆盖(让一个固定长度区间来覆盖若干区间)

@LINK: https://editor.csdn.net/md/?articleId=133790293;

区间选点的最大匹配

@LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=134042414;

N个区间, 对于每个区间x 找到另一区间t 使得x与t的重叠区域最小

详情见: LINK: https://editor.csdn.net/md/?not_checkout=1&articleId=131296003;

mi_len = `所有区间长度的最小值`;
sort( A, A + N);
int pre_rig = 1e9, nex_lef = A[ N-1].first;
for( int i = 0; i < N; ++i){
    auto l = A[i].first, r = A[i].second;
    auto s = r - l + 1;

    int intersect = s; // 最小重叠区域的长度;
    //> pre
    Tools::Min_self( intersect, pre_rig - l + 1);
    //> nex
    Tools::Min_self( intersect, r - nex_lef + 1);
    //> mid
    Tools::Min_self( intersect, mi_len);
    Tools::Max_self( intersect, 0);
	`intersect`就是答案;

    Tools::Min_self( pre_rig, r);
}

特殊的区间合并与消除

详情见: LINK: https://editor.csdn.net/md/?articleId=127923260;

如果有区间[1, 10]; [6, 10], 那么你会得到新区间[1, 5];
如果有区间[1, 5]; [6, 10], 那么你会得到新区间[1, 10];

算法:
For a interval [ l , r ] [l, r] [l,r], we use a pair to denote it ( l − 1 , r ) (l - 1, r) (l1,r) (also can be ( l , r + 1 ) (l, r + 1) (l,r+1)), and then, put l − 1 l-1 l1 and r r r into a same Disjoint-Set.
That is, for a set { a , b , c , d } \{ a, b, c, d \} {a,b,c,d}, it implies 3 + 2 + 1 3 + 2 + 1 3+2+1 intervals.
We choose two elements a , c a, c a,c (if a > c a > c a>c, then swap), this pair ( a , c ) (a, c) (a,c) denotes a interval [ a + 1 , c ] [a + 1, c] [a+1,c]

将N个相交区间: 如果区间相交, 则放入一个并查集内

详情见: LINK: https://editor.csdn.net/md/?articleId=129559755;

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

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、付费专栏及课程。

余额充值