题解——Mushroom的区间(并查集)

题解——Mushroom的区间(并查集)

考试时居然打错了并查集,幸好查出来了


题面

Description

私有题面,已经隐藏

Input

Output

不同的区间数

in.1

3 3
1 1
2 2
3 3

out.1

8

数据范围与约定

对于30%的数据,n,m<=20
对于60%的数据,n,m<=100
对于100%的数据,n,m<=100000

【样例解释】
每个位置都可以单个修改,所以有8种可能。

思路

主要思路

任意一个区间都可以由比它更小的区间拼接而成,这样的区间我们称之为无效区间。然后,我们只要写个并查集维护一下即可。

完整代码

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int MAXN = 100005 , mod = 1000000007 ;
inline int read(){
    int  s = 0 ; char g=getchar() ; while(g>'9'||g<'0')g=getchar() ; 
    while( g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s ;
}
int N , M , fa[ MAXN ] ;
ll ans = 1LL ;
int find( int x ){
    if( fa[ x ] != x )fa[ x ] = find( fa[ x ] ) ;
    return fa[ x ] ;
}
bool check( int x , int y ){
    if( x > y )swap( x , y ) ;
    int fx = find( x ) , fy = find( y+1 ) ;
    if( fx == fy )return false ;
    fa[ fx ] = fy ; return true ;
}
int main(){
    freopen("seg.in","r",stdin);
    freopen("seg.out","w",stdout);
    N = read() , M = read() ; int m1 , m2 ;
    for( int i = 1 ; i <= N+1 ; ++i )fa[ i ] = i ;
    for( int i = 1 ; i <= M ; ++i ){
        m1 = read() , m2 = read() ; 
        if( check( m1 , m2 ) )ans = (ll)ans*2LL%(ll)mod ;
    }
    cout<<ans ;
}

如果这道题放在T1,或许会有更多人A掉吧

如有不足,请大佬指出

转载于:https://www.cnblogs.com/ssw02/p/11477671.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值