题目

一个长度为n的大数,用\(S_1,S_2,S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条

件表示为四个数,\(l_1,r_1,l_2,r_2\),即两个长度相同的区间,表示子串\(S_{l_1},S_{l_1+1},S+{l_1+2}...S_{r_1}\)与\(S_{l_2},S_{l_2+1},S_{l_2+2}...S_{r2}\)完全相同。比如\(n=6\)时,某限制条件\(l_1=1,r_1=3,l_2=4,r_2=6\),那么\(123123\),\(351351\)均满足条件,但是\(12012\),\(131141\)不满足条件,前者数的长度不为6,后者第二位与第五位不同。问满足以上所有条件的数有多少个。

输入格式

第一行两个数\(n\)和\(m\),分别表示大数的长度,以及限制条件的个数。接下来\(m\)行,对于第\(i\)行,有4个数\(l_{i_1},r_{i_1},l_{i_2},r_{i_2}\),分别表示该限制条件对应的两个区间。

\(1≤n≤10^5,1≤m≤10^5,1≤l_{i_1},r_{i_1},l_{i_2},r_{i_2}≤n\)并且保证\(r_{i_1}-l_{i_1}=r_{i_2}-l_{i_2}\)。

输出格式

一个数,表示满足所有条件且长度为n的大数的个数,答案可能很大,因此输出答案模 \(10^9+7\)的结果即可。

输入样例

4 2
1 2 3 4
3 3 3 3

输出样例

90

题解

这道题使用并查集和ST表

\(f\)是\(ST\)表数组, \(f_{i,j}\)表示\([i,i+2^j-1]\)

一个条件可以拆成\(log\)份,然后再合并。

若\(f_{s,t}\)和\(f_{i,j}\)在同一集合,则\(f_{s,t-1}\)与\(f_{i,j-1}\)以及\(f_{s+2^{t-1}-1,t-1}\)和\(f_{i+2^{j-1}-1,j-1}\)都在同一集合。

为了满足条件,一层一层的做,把下一层的合并,编号大的合进编号小。

设\(tot\)为集合个数

答案就是\(9*10^(tot-1)\)

代码

#include <cmath>
#include <cstdio>
using namespace std;
int n, m, fa[100005][18], ans;
int find(int x, int k) { return fa[x][k] == x ? x : fa[x][k] = find(fa[x][k], k); }
void join(int x, int y, int k) { if ((x = find(x, k)) != (y = find(y, k))) fa[x][k] = y; }
int main() {
scanf("%d %d", &n, &m);
int maxk = floor(log2(n));
for (int i = 1; i <= n; ++i)
for (int k = 0; k <= maxk; ++k) fa[i][k] = i;
for (int i = 1, l1, r1, l2, r2; i <= m; ++i) {
scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
for (int k = maxk; ~k; --k)
if (l1 + (1 << k) - 1 <= r1)
join(l1, l2, k), l1 += 1 << k, l2 += 1 << k;
}
for (int k = maxk; k; --k)
for (int i = 1; i + (1 << k) - 1 <= n; ++i) {
int pos = find(i, k);
join(i, pos, k - 1);
join(i + (1 << k - 1), pos + (1 << k - 1), k - 1);
}
for (int i = 1; i <= n; ++i)
if (fa[i][0] == i) ans = !ans ? 9 : ans * 10ll % 1000000007;
printf("%d\n", ans);
return 0;
}

P3295 萌萌哒 题解的更多相关文章

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

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

  2. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  3. 洛谷P3295 萌萌哒 [SCOI2016] 倍增+并查集

    正解:倍增+并查集 解题报告: 传送门! 首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣 然后看下复杂度,修改是O(n2)查询是O(n),就比较容易 ...

  4. BZOJ2659: [Beijing wc2012]算不出的算式

    2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 668  Solved: 366[Submit] ...

  5. 几道莫名AC的并查集题

    那啥那啥 原本今天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了. %%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊. 第一道:洛谷P202 ...

  6. Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)

    P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...

  7. 【题解】SCOI2006萌萌哒

    看到这题,首先想到\(n^{2}\)的暴力,就是用并查集暴力合并两个相等的点.但由于这样会导致反复地访问同一个操作,显然是不能够的.于是我们可以联想这题的特殊性质,就是互相连变的点都是一段一段的区间. ...

  8. ETO的公开赛T4《对抗水滴》 题解(BY 萌萌哒123456 )

    题意: 给你一个\(n*n\)的矩阵A,其中有\(T\)个元素不为零.定义矩阵内元素\((x,y)\)的能量值 \(E[x][y]=\sum_{i=1}^{x}\sum_{j=1}^{y}[A[i][ ...

  9. [Luogu P3295][SCOI 2016]萌萌哒

    先说下暴力做法,如果[l1,r1]和[l2,r2]子串相等等价于两个区间内每个数对应相等.那么可以用并查集暴力维护,把对应相等的数的位置维护到同一个集合里去,最后答案其实就是把每个集合可以放的数个数乘 ...

随机推荐

  1. 一口气说出9种分布式ID生成方式,面试官有点懵

    一.为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 1.1.什么是分布式ID? 拿MySQL数据库举个栗子:在我们业务数据量不 ...

  2. 如何在交互式环境中执行Python程序

    相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Pyth ...

  3. JAVA第三次blog总结

    JAVA第三次blog总结 0.前言 这是我们在博客园上第三次写博客,也是本学期最后一次的JAVA学习大总结.现在我们的JAVA已经接近尾声了,对于编程思想和方法的改变依旧是难点,但是经过这一段时间的 ...

  4. WPF 如何流畅地滚动ScrollViewer 简单实现下

    看了看原生UWP的ScrollViewer,滑动很流畅(例如 开始菜单),但是WPF自带的ScrollViewer滚动十分生硬.. 突发奇想,今天来实现一个流畅滚动的ScrollViewer. 一.目 ...

  5. 自动完成 APP【字典树(Trie树)+dfs】

    自动完成 APP 传送门  来源:upc12786 题目描述 奶牛 Bessie 很喜欢用手机上网聊天,但她的蹄子太大,经常会按到好几个键造成不必要的麻烦(丢死人了,你下辈子还是不要当奶牛了).于是 ...

  6. group by <grouping sets(...) ><cube(...)>

    GROUP BY      GROUPING SETS() 后面将还会写学习 with cube,  with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...

  7. 【Java入门】JDK安装和环境变量配置(Win7版)

    系统环境:Windows7 x64 安装JDK和JRE版本:1.8.0_191 1.下载JDK安装包 Oracle官网下载网址:https://www.oracle.com/technetwork/j ...

  8. Docker镜像与容器的常用操作

    Docker镜像加速配置:Docker镜像常用操作:Dcoker容器常用操作. 镜像加速器 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器.国内很多云服务商都提供了国内加 ...

  9. jmeter录制app测试脚本

    1.jmeter 下载地址 https://jmeter.apache.org 2.选择下载包 3.下载完成后解压即可使用(也可以配置环境变量,但我一般不配置,可以使用) 4.打开jmeter 创建线 ...

  10. 文本溢出后,隐藏显示"..."和margin边距重叠

    一.隐藏加省略 单行文本: overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 多行文本: overflow: hidden ...