题解——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掉吧