题目内容

洛谷链接

一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条件表示为四个数,\(l_1,r_1,l_2,r_2,\)即两个长度相同的区间,表示子串\(S_{l1}S_{l1+1}S_{l1+2}...S_{r1}\)与\(S_{l2}S_{l2+1}S_{l2+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_{i1},r_{i1},l_{i2},r_{i2}\),分别表示该限制条件对应的两个区间。

\(1≤n≤10^5,1≤m≤10^5,1≤l_{i1},r_{i1},l_{i2},r_{i2}≤n\)

并且保证\(r_{i1}-l_{i1}=r_{i2}-l_{i2}\)。

输出格式

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

样例输入

4 2

1 2 3 4

3 3 3 3

样例输出

90

思路

并查集+ST表,利用倍增合并集合。

代码

#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=1e5+10;
const int Mod=1e9+7;
int n,m;
int fa[maxn][20];//表示[i,i+2^j-1]
long long ans; void init(int k){
for (int i=1;i<=n;++i)
for (int j=0; j<=k;++j)
fa[i][j] = i;
} int find(int x, int y){
return x==fa[x][y] ? x : (fa[x][y]=find(fa[x][y],y));
} void merge(int x, int y, int j){
int fx=find(x,j),fy=find(y,j);
if((fx!=fy))fa[x][j]=y;
} int main() {
scanf("%d %d", &n, &m);
int maxj = floor(log2(n));//求一下最大倍增次数,也可以直接用20 init(maxj); for (int i=1;i<=m;++i){
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
for (int j=maxj;j!=-1;--j)
if (l1+(1<<j)-1<=r1){
merge(l1,l2,j);
l1+=1<<j;
l2+=1<<j;
}
} for (int j=maxj;j;--j)
for (int i=1;i+(1<<j)-1<=n;++i) {
int fath=find(i,j);
merge(i,fath,j-1);
merge(i+(1<<j-1),fath+(1<<j-1),j-1);
} for(int i=1;i<=n;++i)
if (fa[i][0]==i)ans=!ans ? 9 : ans*10%Mod; printf("%lld\n",ans);
return 0;
}

最新文章

  1. Java初始化过程
  2. html学习记录之表格、表单基础
  3. 内存管理单元(MMU)和协处理器CP15介绍(转)
  4. MySQL you *might* want to use the less safe log_bin_trust_function_creators variable
  5. Selenium自动化测试项目案例实践公开课
  6. sql except 用法,找两个表中非共同拥有的
  7. Sqlserver2008日志压缩
  8. 如何解决火狐FF里Input标签刷新页面后 仍然保存之前输入的内容的方法。
  9. UNION语句查询(转载)
  10. 使用MonkeyTest对Android客户端进行压力测试 自动化代码
  11. selenium支付高版本的FireFox
  12. jquery easyui的layout
  13. 【HDOJ】3309 Roll The Cube
  14. poj2352 Stars
  15. poj1088 经典DP
  16. 快速开发平台WebBuilder中ExtJS表格的增删改查
  17. 双向循环链表(C语言描述)(四)
  18. C#核心语法讲解-泛型(详细讲解泛型方法、泛型类、泛型接口、泛型约束,了解协变逆变)
  19. 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
  20. js希尔排序

热门文章

  1. 第一课、python基础学习笔记
  2. md5命令
  3. ulimit 的认识
  4. NX二次开发-NX访问SqlServer数据库(增删改查)C#版
  5. docker 搭建私有云仓库
  6. Cobalt Strike后渗透安装和初步使用
  7. java 常用类-String-1
  8. [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权
  9. Python安装与环境变量配置 入门详解 - 精简归纳
  10. NodeJS沙箱逃逸&amp;&amp;vm