博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)
阅读量:5323 次
发布时间:2019-06-14

本文共 2117 字,大约阅读时间需要 7 分钟。

 

思路太妙了啊……

容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0)

考虑倍增。我们设$f[i][j]$表示区间$[i,i+2^j-1]$,那么我们可以把原区间给拆成$log$个区间,然后维护这些区间的连通性

然而我们最后需要的是最底层的,也就是单独的节点的连通性。那么我们考虑如何将连通性向下传递。如果$f[i][j]$和$f[a][b]$连通,那么$f[i][j-1]$和$f[a][b-1]$一定连通(前半部分区间),$f[i+2^{j-1}][j-1]$和$f[a+2^{b-1}][b-1]$也一定连通

ps:连通性肯定都在同一层,所以实际上上面的$j$和$b$一般都是相等的

然后只要最后判最底层有几个并查集就好了

1 //minamoto 2 #include
3 #include
4 using namespace std; 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 6 char buf[1<<21],*p1=buf,*p2=buf; 7 int read(){ 8 #define num ch-'0' 9 char ch;bool flag=0;int res;10 while(!isdigit(ch=getc()))11 (ch=='-')&&(flag=true);12 for(res=num;isdigit(ch=getc());res=res*10+num);13 (flag)&&(res=-res);14 #undef num15 return res;16 }17 const int N=1e5+5,mod=1e9+7;18 int fa[N*17],id[N][21],num[N*17],log[N*17],bin[21],is[N*17],h[N*17],tot=0,cnt;19 int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);}20 void merge(int x,int y){21 x=find(x),y=find(y);22 if(h[x]
h[y]) fa[y]=x;24 else fa[x]=y,++h[y];25 }26 int ksm(int b){27 int res=9,a=10;28 while(b){29 if(b&1) res=1ll*res*a%mod;30 a=1ll*a*a%mod,b>>=1;31 }32 return res;33 }34 int main(){35 // freopen("testdata.in","r",stdin);36 int n=read(),m=read();37 bin[0]=1;for(int i=1;i<=16;++i) bin[i]=bin[i-1]<<1;38 for(int j=0;j<=16;++j) for(int i=1;i<=n;++i) id[i][j]=++tot,num[tot]=i,fa[tot]=tot,h[tot]=1;39 while(m--){40 int l1=read(),r1=read(),l2=read(),r2=read();41 for(int i=16;i>=0;--i) if(l1+bin[i]-1<=r1){42 merge(id[l1][i],id[l2][i]),l1+=bin[i],l2+=bin[i];43 }44 }45 for(int j=16;j;--j) for(int i=1;i+bin[j]-1<=n;++i){46 int x=find(id[i][j]),a=num[x];47 merge(id[a][j-1],id[i][j-1]),merge(id[a+bin[j-1]][j-1],id[i+bin[j-1]][j-1]);48 }49 for(int i=1;i<=n;++i)50 if(find(id[i][0])==id[i][0]) ++cnt;51 printf("%d\n",ksm(cnt-1));52 return 0;53 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9812565.html

你可能感兴趣的文章
Confluence配置数据库
查看>>
Java锁机制(一)synchronized
查看>>
002.文件删除功能
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
06-redis主从
查看>>
linux下面桌面的安装
查看>>
thinkphp如何实现伪静态
查看>>
作业引擎quartz.net --- 监听链
查看>>
iframe传参数
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
C语言学习记录_2019.02.06
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
字符串比较
查看>>
epoll 技术(转)
查看>>
<转>Shell脚本相关
查看>>
使用FreeMarker加载远程主机上模板文件,比如FTP,Hadoop等(转载)
查看>>
Java的位运算符具体解释实例——与(&amp;)、非(~)、或(|)、异或(^)
查看>>