BZOJ 4569: [Scoi2016]萌萌哒【倍增并查集

来源:互联网 发布:暗黑破坏神2画面优化 编辑:程序博客网 时间:2024/06/10 09:45

倍增并查集,考试naive地写的暴力_(:_ゝ∠)_

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;int n,m;const int MAXN=100057;const int MOD=1000000007;int f[17][MAXN];int a,b,c,d,k;long long ans=9;intfindfather(int c,int x){ return f[c][x]==x?x:f[c][x]=findfather(c,f[c][x]);}void merge(int c,int x,int y){if(findfather(c,x)==findfather(c,y))return ;f[c][f[c][x]]=f[c][y];if(!c)return ;--c;merge(c,x,y),merge(c,x+(1<<c),y+(1<<c));} int main(){scanf("%d%d",&n,&m);if(n==1)return puts("10"),0;for(int i=0;(1<<i)<=n;++i)for(int j=1;j+(1<<i)-1<=n;++j)f[i][j]=j;while(m--){scanf("%d%d%d%d",&a,&b,&c,&d);if(a==c)continue;for(k=0;(1<<k)<=(b-a+1);++k);--k;//k=31-__builtin_clz(b-a+1);merge(k,a,c),merge(k,b-(1<<k)+1,d-(1<<k)+1);}int cnt=-1;for(int i=1;i<=n;++i)if(findfather(0,i)==i)++cnt;while(cnt-->0){ans*=10;if(ans>=MOD)ans%=MOD;}cout<<ans;return 0;}


0 0
原创粉丝点击