题目大意

一个没有前导零的 n n位数,一共有mm个约束,形如将数看作字符串,子串 [l1,r1] [l1,r1]与 [l2,r2] [l2,r2]相等。
求可能的数的个数,结果模 1000000007 1000000007。

1≤n,m≤105 1\le n,m\le 10^5


题目分析

可以发现约束其实就是一些对应位置相等的限制,我们使用并查集,采用最暴力方法合并,时间复杂度为 O(nm) \mathrm O(nm)。如果最后一共剩下 cnt cnt个集合,如果某个集合不包含第一位,那么它肯定有 10 10种取值,否则只有 9 9种。那么答案就是9×10cnt−19\times10^{cnt-1}(当然 n=1 n=1时答案为 10 10)。
我们考虑使用 STi,j \mathrm{ST}_{i,j}表来优化合并。另 STi,j \mathrm{ST}_{i,j}表示区间 [i,i+2j−1] [i,i+2^j-1]所在的集合。一开始每一个 STi,j \mathrm{ST}_{i,j}都单独一个集合。那么一个约束,就可以转化为 log2n log_2n个集合的相等关系,我们将这些集合一一合并即可。
然后我们就按 j j从大到小的顺序进行集合合并,令STi,j\mathrm{ST}_{i,j}所在集合的父亲为 k k,那么将STi,j\mathrm{ST}_{i,j}的左右两个子区间分别与 k k的左右两个子区间合并。做完后STi,0\mathrm {ST}_{i,0}就是位置 i i所在集合,那么统计答案就很容易了。
注意我们要判断该集合是否包含位置11,处理方法有很多种。这里我是强行将编号大的合并到编号小的位置,那么包含 1 1的集合顶肯定是11。
总的时间复杂度 O(nα(n)log2n) O(n\alpha(n)log_2n)。


代码实现

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cctype>using namespace std;int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-')f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;
}const int P=1000000007;
const int N=100500;
const int LGN=17;int sta[N*LGN],fa[N*LGN];
int n,m,tot,ans;
int ST[N][LGN];int getfather(int son){return fa[son]==son?son:fa[son]=getfather(fa[son]);}void merge(int l1,int l2,int j)
{int f1=getfather(ST[l1][j]),f2=getfather(ST[l2][j]);if (f1>f2) swap(f1,f2);if (f1!=f2)fa[f2]=f1;
}int main()
{freopen("cutie.in","r",stdin);freopen("cutie.out","w",stdout);n=read(),m=read();if (n==1)printf("10\n");else{for (int i=1;i<=n;i++)for (int j=0;i+(1<<j)-1<=n;j++)ST[i][j]=++tot,sta[tot]=i,fa[tot]=tot;for (int i=1,l1,r1,l2,r2;i<=m;i++){l1=read(),r1=read(),l2=read(),r2=read();for (int j=LGN-1;j>=0;j--)if (l1+(1<<j)-1<=r1){merge(l1,l2,j);l1+=1<<j,l2+=1<<j;}}for (int j=LGN-1;j>=1;j--)for (int i=1;i+(1<<j)-1<=n;i++){int f=getfather(ST[i][j]),i0=sta[f];merge(i0,i,j-1),merge(i0+(1<<j-1),i+(1<<j-1),j-1);}ans=1;for (int i=1;i<=n;i++)if (fa[ST[i][0]]==ST[i][0])ans=ans*1ll*(i==1?9:10)%P;printf("%d\n",ans);}fclose(stdin);fclose(stdout);return 0;
}

[SCOI2016][BZOJ4569]萌萌哒相关推荐

  1. bzoj4569【SCOI2016】萌萌哒

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

  2. 【LOJ】#2014. 「SCOI2016」萌萌哒

    题解 这个题好妙啊 首先我们发现,如果我们可以暴力,就是把相同的元素拿并查集合起来,最后统计集合个数\(cnt\) 答案是\(9\*10^{cnt - 1}\) 然而我们做不到= = 我们可以用倍增的 ...

  3. BZOJ4569: [Scoi2016]萌萌哒

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

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

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

  5. bzoj4569[Scoi2016]萌萌哒

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

  6. [bzoj4569][SCOI2016]萌萌哒

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

  7. BZOJ4569 [Scoi2016]萌萌哒

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

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

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

  9. p3295 [SCOI2016]萌萌哒

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

最新文章

  1. Linux 升级 Python 至 3.x
  2. 交互式计算机图形学总结:第七章 离散技术
  3. python 占位符_5分钟让你用Python作出最精美的Powerpoint
  4. COLINUX的安装与网络配置
  5. python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
  6. Java黑皮书课后题第10章:*10.19(Mersenne素数)
  7. linux python连接oracle数据库_Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法...
  8. 常见的php笔试题(附答案)搜集整理
  9. c# ef报错_C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案
  10. Java虚拟机-第二篇-GC算法与内存分配策略
  11. 最长回文子串java_5. 最长回文子串
  12. 大数据 ---(4)大数据驱动的金融业务创新(用户画像-数据架构-标签建模)
  13. Graph Anomaly Detection with Deep Learning——基于属性图的节点异常检测
  14. WebView 监听 H5 下载
  15. 大牛教你如何利用积分商城API接口对接积分商城平台
  16. 文本情感倾向分析——机器学习模型
  17. 圣诞节来了,雪花纷飞的CSS3动画
  18. ROS环境下使用WHEELTEC N100惯导模块
  19. 戒指在不同手指的意义
  20. linux centos7以上的自带监控界面cockpit案例

热门文章

  1. 大学课程设计:邮件系统
  2. 2021年亚太杯APMCM数学建模大赛C题生态保护的建设及其对环境影响的评价求解全过程文档及程序
  3. oracle 19cRAC FOR redhat8.2 on vmware workstation 16.0
  4. 使用龙骨动画(动态改变龙骨动画名称)
  5. 前端每日实战:54# 视频演示如何用纯 CSS 创作一副国际象棋
  6. 视觉SLAM十四讲读书笔记(3)P27-P31
  7. 这只是一个有关于安全系统的基本介绍
  8. 自定义域名并添加SSL
  9. 向量的交叉积计算 python的实现 ~python
  10. 金优商城古树普洱茶为什么越喝越甘甜?