题解

首先可以有一个\(O(n^2a(n))\)的做法
就是用并查集来把对应相同的点合并起来
最后答案就是\(9 \times 10^{联通块个数-1}\)
然后考虑优化这个过程
可以发现每次合并都是把一个区间的点和另外一个区间的点对应的一一合并
所以可以用\(st[i][j]\)表示\([i,i+2^j-1]\)这段区间
然后合并时候就把对应的区间拆成不超过\(log\)个区间合并起来就行了
注意最后\(pushdown\)的时候就从上往下更新,把左右儿子与这个点的并查集的那个点所对应的儿子合并即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int M = 100005 ;
const int N = 18 ;
const int mod = 1e9 + 7 ;
using namespace std ;
inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }return x*w ;
}int n , m , lg[M] ;
int cnt , tot , st[M][N] , f[M * N] , ls[M * N] , rs[M * N] ;inline int Fpw(int Base , int k) {int temp = 1 ;while(k) {if(k & 1) temp = 1LL * temp * Base % mod ;Base = 1LL * Base * Base % mod ; k >>= 1 ;}return temp ;
}
int find(int x) {if(f[x] != x) f[x] = find(f[x]) ;return f[x] ;
}
inline void Merge(int u , int v) {int x = find(u) , y = find(v) ;if(x == y) return ; f[x] = y ;
}int main() {n = read() ; m = read() ;for(int i = 2 ; i <= n ; i ++) lg[i] = lg[i >> 1] + 1 ;for(int j = 0 ; j <= lg[n] ; j ++)for(int i = 1 ; i + (1 << j) - 1 <= n ; i ++)st[i][j] = ++ cnt ;for(int j = 1 ; j <= lg[n] ; j ++)for(int i = 1 ; i + (1 << j) - 1 <= n ; i ++)ls[st[i][j]] = st[i][j - 1] , rs[st[i][j]] = st[i + (1 << (j - 1))][j - 1] ;for(int i = 1 ; i <= cnt ; i ++) f[i] = i ;for(int i = 1 , l1 , r1 , l2 , r2 ; i <= m ; i ++) {l1 = read() ; r1 = read() ; l2 = read() ; r2 = read() ;for(int j = lg[r1 - l1 + 1] ; j >= 0 ; j --)if(l1 + (1 << j) - 1 <= r1) {Merge(st[l1][j] , st[l2][j]) ;l1 += (1 << j) ; l2 += (1 << j) ;}}for(int j = lg[n] ; j >= 1 ; j --) {for(int i = 1 , x ; i + (1 << j) - 1 <= n ; i ++) {x = find(st[i][j]) ;Merge(st[i][j - 1] , ls[x]) ;Merge(st[i + (1 << (j - 1))][j - 1] , rs[x]) ;}}for(int i = 1 , x ; i <= n ; i ++) {x = find(st[i][0]) ;if(x == st[i][0]) ++ tot ;}printf("%lld\n",1LL * 9 * Fpw(10 , tot - 1) % mod) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/10639000.html

[SCOI2016]萌萌哒相关推荐

  1. BZOJ4569: [Scoi2016]萌萌哒

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 961  Solved: 464 [Submit][Statu ...

  2. P3295 [SCOI2016]萌萌哒(DP+倍增)

    P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结 ...

  3. p3295 [SCOI2016]萌萌哒

    传送门 分析 我们可以将一个点拆成logN个点,分别代表从点i开始,长度为2^k的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成log个区间,分别并起来即可 当然我们这样做修改是省 ...

  4. 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)

    传送门 思路太妙了啊-- 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...

  5. luogu P3295 [SCOI2016]萌萌哒

    传送门 题目条件"两个子串\(S[l_1,r_1],S[l_2,r_2]\)完全相同"等价于\(\forall i \in[0,r_1-l_1+1],S_{l1+i}=S_{l_2 ...

  6. bzoj4569 [Scoi2016]萌萌哒 并查集+st表

    这个题非常巧妙,它描述了一种新的延迟标记关系.. 正常的线段树是用n*4的空间描述一个序列,所以对于一段区间,有可能会有log个点对应一个点 而线段树是利用尽量小的空间使查询变为log st表是nlo ...

  7. bzoj4569[Scoi2016]萌萌哒

    Description 给出一个有n位的无前导0正整数,再给出m个限制,每个限制形如l1-r1,l2..r2表示这个数的l1~r1位和第l2~r2位是相等的.求这样的数的个数. n,m<=10^ ...

  8. [bzoj4569][SCOI2016]萌萌哒

    题目大意 有一个无前导0的n位数,有m个限制形如[l1,r1]=[l2,r2],问满足条件的数有多少种,答案模10^9+7. 倍增 我们用ST表,f[i,j]表示[i,i+2^j-1]这一段. 那么初 ...

  9. BZOJ4569 [Scoi2016]萌萌哒

    一眼觉得是并查集,yy了一下线段树优化发现不可sing,orz了ljss神犇被告知是倍增优化 倍增,一个点[i][j]代表某个i往后2^j个数,把点按倍增次数分层,两个同层的点在一个连通块说明两个点所 ...

  10. bzoj4569【SCOI2016】萌萌哒

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 403   Solved: 176 [ Submit][ S ...

最新文章

  1. 计算机入域时域控用到的端口,AD域控制器使用端口的说明
  2. 面部表情自动识别技术及在游戏行业的应用
  3. iOS进阶之架构设计MVVM的理解(3)
  4. Acalvio正式推出其新型安全防御技术——流欺骗
  5. 002_Maven命令
  6. (常用API)正则表达式的概念和作用
  7. 移动端小程序 腾讯地图sdk 当前位置 地址你解析 距离计算
  8. android 语音编码,android – 如何将录制的语音编码为ogg vorbis?
  9. java transferto_小六六学Netty系列之Java 零拷贝
  10. SQLi LABS Less-39
  11. LeetCode1.两数之和
  12. 【Spring-AOP】底层类ProxyConfig,ProxyProcessorSupport分析
  13. 关闭戴尔增霸卡!!!
  14. 软件概要设计说明书—模板
  15. mysql 左连接都是null_sql左连接有疑问,为什么查出来都是null,而不是没有数据?...
  16. php opcode列表,PHP中的opcode
  17. 织梦DEDE正则查找批量替换数据库自定义内容
  18. MySQL在Windows和Linux平台上多版本多实例安装配置方法(5.5、5.6、5.7、8.0)
  19. 把思科端口速率改为不协商_端口汇聚—TRUNK技术介绍
  20. 弹弹堂服务器找不到,4399弹弹堂 合服常见问题及解答

热门文章

  1. APP推广运营经验总结
  2. python 指定版本号
  3. “鬼才”论文致谢刷屏!感谢我导“似导非导”的指导……
  4. 【过拟合】再也不用担心过拟合的问题了
  5. 【论文解读】结合概率图模型和神经网络做图片问答
  6. 一文看尽预训练语言模型
  7. matplotlib--python的数据可视化入门
  8. 神经网络基础模型--Logistic Regression的理论和实践
  9. Bert模型冻结指定参数
  10. Datawhale编程学习之数组和链表(1)