【ST表】SCOI2016 萌萌哒
题目内容
洛谷链接
一个长度为\(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;
}
【ST表】SCOI2016 萌萌哒的更多相关文章
- LOJ2014 SCOI2016 萌萌哒 并查集、ST表优化连边
传送门 一个朴素的做法就是暴力连边并查集,可是这是\(O(n^2)\)的.发现每一次连边可以看成两个区间覆盖,这两个区间之间一一对应地连边.可线段树对应的两个节点的size可能不同,这会导致" ...
- BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...
- bzoj4569: [Scoi2016]萌萌哒(ST表+并查集)
好喵喵的题 将一个要求用ST表分割成logn个要求,如果把f[i][j]和f[u][v]在同一个集合,那么f[i][j-1]和f[u][v-1],f[i+2^(j-1)][j-1]和f[u][u+2^ ...
- bzoj 4569 [Scoi2016]萌萌哒 并查集 + ST表
题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每 ...
- BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集
好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...
- 【BZOJ-4569】萌萌哒 ST表 + 并查集
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 459 Solved: 209[Submit][Status] ...
- luogu3295 萌萌哒 (并查集+ST表)
如果给相同的位置连边,最后联通块数是n,最后答案就是$9*10^{n-1}$ 但直接连边是$O(n^2)$的 所以事先处理出一个ST表,每次O(1)地给那个ST表连边 最后再一点一点下放,就是把在这层 ...
- 洛谷P3295 萌萌哒 并查集 + ST表
又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...
- RMQ求解->ST表
ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j ...
随机推荐
- Ajax获取接口数据,url拼接参数跳转页面,js获取上一级页面参数给本页面
1.Ajax获取接口数据 function demo(){ //假设请求参数 var requestBody = [{ "name":"zhang", &quo ...
- 《C语言进阶剖析》课程目录
<C语言进阶剖析>学习笔记 本文总结自狄泰软件学院唐佐林老师的<C语言 ...
- 第18课 - make 中的路径搜索(下)
第18课 - make 中的路径搜索(下) 1. 问题一 当 VPATH 和 vpath 同时出现,make 会如何处理? 工程项目的目录结构如下图所示,src1 和 src2 中都包含了 func. ...
- 使用App Metrics实现性能监控
App Metrics监控需要安装InfluxDB时序数据库和Grafana可视化分析工具 1.安装InfluxDB 下载地址:https://portal.influxdata.com/downlo ...
- JAVA基础知识之面向对象编程知识汇总
JAVA基础课程部分面向对象已经学习完成,知识结构如下: 总体知识框架: 类的结构: 面向对象编程三大特征: 关键字和抽象类接口等: 常见知识汇总: 成员变量和局部变量比较 有无返回值方法比较: 权限 ...
- Redis单机安装以及集群搭建
今天主要来看一下Redis的安装以及集群搭建(我也是第一次搭建). 环境:CentOS 7.1,redis-5.0.7 一.单机安装 1.将Redis安装包放置服务器并解压 2.进入redis安装目录 ...
- json与字典的相互转化
json格式初学者如果在编辑器中自己编写一个json格式,可能会出错:虽然json格式本质上也是字符串,但是json格式要求,要使用双引号将key和value括起来: 如果要将上面的字符串格式和jso ...
- Salesforce LWC学习(二十六) 简单知识总结篇三
首先本篇感谢长源edward老哥的大力帮助. 背景:我们在前端开发的时候,经常会用到输入框,并且对这个输入框设置 required或者其他的验证,当不满足条件时使用自定义的UI或者使用标准的 inpu ...
- 破晓行动----带你总结JVM的知识大全(二)
JVM运行时内存 + 垃圾回收与算法
- Spring学习(八)--Spring的AOP
自工作以后身不由己,加班无数,996.995不可控制,高高立起的flag无法完成,无奈,随波逐流,尽力而已! 1.advice通知 advice主要描述Spring AOP 围绕奥方法调用而注入的切面 ...