传送门

思路太妙了啊……

容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$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<iostream>
  3. #include<cstdio>
  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[<<],*p1=buf,*p2=buf;
  7. int read(){
  8. #define num ch-'0'
  9. char ch;bool flag=;int res;
  10. while(!isdigit(ch=getc()))
  11. (ch=='-')&&(flag=true);
  12. for(res=num;isdigit(ch=getc());res=res*+num);
  13. (flag)&&(res=-res);
  14. #undef num
  15. return res;
  16. }
  17. const int N=1e5+,mod=1e9+;
  18. int fa[N*],id[N][],num[N*],log[N*],bin[],is[N*],h[N*],tot=,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[x]=y;
  23. else if(h[x]>h[y]) fa[y]=x;
  24. else fa[x]=y,++h[y];
  25. }
  26. int ksm(int b){
  27. int res=,a=;
  28. while(b){
  29. if(b&) res=1ll*res*a%mod;
  30. a=1ll*a*a%mod,b>>=;
  31. }
  32. return res;
  33. }
  34. int main(){
  35. // freopen("testdata.in","r",stdin);
  36. int n=read(),m=read();
  37. bin[]=;for(int i=;i<=;++i) bin[i]=bin[i-]<<;
  38. for(int j=;j<=;++j) for(int i=;i<=n;++i) id[i][j]=++tot,num[tot]=i,fa[tot]=tot,h[tot]=;
  39. while(m--){
  40. int l1=read(),r1=read(),l2=read(),r2=read();
  41. for(int i=;i>=;--i) if(l1+bin[i]-<=r1){
  42. merge(id[l1][i],id[l2][i]),l1+=bin[i],l2+=bin[i];
  43. }
  44. }
  45. for(int j=;j;--j) for(int i=;i+bin[j]-<=n;++i){
  46. int x=find(id[i][j]),a=num[x];
  47. merge(id[a][j-],id[i][j-]),merge(id[a+bin[j-]][j-],id[i+bin[j-]][j-]);
  48. }
  49. for(int i=;i<=n;++i)
  50. if(find(id[i][])==id[i][]) ++cnt;
  51. printf("%d\n",ksm(cnt-));
  52. return ;
  53. }

洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)的更多相关文章

  1. 洛谷P3295 [SCOI2016]萌萌哒 题解

    洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同 ...

  2. 【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集

    [BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四 ...

  3. [SCOI2016]萌萌哒(倍增+并查集)

    一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1 ...

  4. [BZOJ4569][SCOI2016]萌萌哒(倍增+并查集)

    首先有一个显然的$O(n^2)$暴力做法,将每个位置看成点,然后将所有限制相等的数之间用并查集合并,最后答案就是9*(10^连通块的个数).(特判n=1时就是10). 然后比较容易想到的是,由于每次合 ...

  5. 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边

    题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...

  6. 2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)

    传送门 对于每个限制,使用倍增的二进制拆分思想,用并查集数组fa[i][j]" role="presentation" style="position: rel ...

  7. BZOJ4569 [SCOI2016]萌萌哒 【并查集 + 倍增】

    题目链接 BZOJ4569 题解 倍增的思想很棒 题目实际上就是每次让我们合并两个区间对应位置的数,最后的答案\(ans = 9 \times 10^{tot - 1}\),\(tot\)是联通块数, ...

  8. Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)

    题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...

  9. 洛谷1525 关押罪犯NOIP2010 并查集

    问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...

随机推荐

  1. HDU 6390

    GuGuFishtion Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp

    品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...

  3. 2017多校Round7(hdu6120~hdu6132)

    补题进度:9/13 1001 待填坑 1002(数学推导) 题意 有一个按顺序的n个点的k叉树,问每个点子树个数的异或和是多少(n,k<=1e18) 分析 可以先求出最大的d,满足d以上都是满K ...

  4. 收集的一些Redis操作技巧教程

    redis(1).redis入门 redis(2).redis数据类型 redis(3).基于jedis.spring-data-redis 连接操作redis redis(4).基于redis 构建 ...

  5. CentOS7 设置系统时间

    在CentOS 6版本,时间设置有date.hwclock命令, 硬件时钟和系统时钟 (1) 硬件时钟 RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会 ...

  6. iOS中MRC和ARC混编

    1. 在targets的build phases选项下Compile Sources下选择,不使用arc编译的文件.双击它.输入 -fno-objc-arc 就可以(这个类就能够使用MRC模式) 2. ...

  7. Android常见UI组件之ListView(二)——定制ListView

    Android常见UI组件之ListView(二)--定制ListView 这一篇接上篇.展示ListView中选择多个项及实现筛选功能~ 1.在位于res/values目录下的strings.xml ...

  8. Android 自己定义View须要重写ondraw()等方法

    Android  自己定义View须要重写ondraw()等方法.这篇博客给大家说说自己定义View的写法,须要我们继承View,然后重写一些 方法,方法多多,看你须要什么方法 首先写一个自己定义的V ...

  9. Mongodb for PHP教程之管理工具

    1:下面的事情应该是PHP程序员应该了解的,更详细的参考可以百度谷歌之 mongodb PHP官方文档http://us.php.net/manual/en/book.mongo.php 1.Mong ...

  10. http协议的相关知识

    因为如今的工作设计的Web开发,因此了解了一下Http协议.在阅读了这篇文章HTTP协议具体解释(真的非常经典)后,总结了相关经常使用知识并列在此处以方便以后的查询. HTTP协议的主要特点可概括例如 ...