孟孟ダ
効果の対象に
数、mはあなたの関係を与えるnビットの合計であって、各関係\((L1、R1、L2、R2)\) 、代表\(〜L1 R1 \)、\ (L2 R2〜\)の両方条件を満足するように求めて、このような同一の間隔数のカウント数、
\(nlogn \)の範囲
解決
暴力的な練習、我々がセットにこれらの間隔にそれぞれ対応する点を置くたびに検討し、顔をしていると確認し、最後の直接リンクブロックの数をカウントし、答えは\(9 \回10 ^ {数} \)
乗算最適化、設計の検討(FA [X] [Y \する ] \) 出発点xとして代表的な、長さ\(1 <<のY \)このセクションの父親
いくつかの間隔をマージ終え、我々は組み合わせ短距離の最長の範囲と一定の内訳で始まり、我々はいくつかのセクションに分割した後、各区間について、父親の最終的にすべての点を決定することができます
ブロックの数ユニコムの最後に、同じ番号
コード:
#include<bits/stdc++.h>
using namespace std;
const int mod=(1e9+7);
int fa[200010][21];
int getfa(int x,int y){
return fa[x][y]==x?x:fa[x][y]=getfa(fa[x][y],y);
}
void merge(int x,int y,int len){
x=getfa(x,len);
y=getfa(y,len);
if(x!=y)fa[x][len]=y;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=20;++i){
for(int j=1;j<=n;++j){
fa[j][i]=j;
}
}
for(int i=1;i<=m;++i){
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
int x=(r1-l1+1);
for(int j=20;j>=0;--j){
if(x&(1<<j)){
merge(l1,l2,j);
l1+=(1<<j),l2+=(1<<j);
}
}
}
for(int i=20;i>=1;--i){
for(int j=1;j+(1<<i)-1<=n;++j){
merge(j,getfa(j,i),i-1);
merge(j+(1<<i-1),getfa(j,i)+(1<<i-1),i-1);
}
}
int ans=9;
int num=0;
for(int i=1;i<=n;++i){
if(fa[i][0]==i){
num++;
if(num>1){
ans=(ans*1ll*10)%mod;
}
}
}
printf("%d\n",ans);
}