BZOJ 4569: [Scoi2016]萌萌哒 [并查集 倍增]
题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数
把所有要求相等的位置连起来,不就是$9*10^{连通块个数}$嘛
但是最坏情况要连$nm$次啊
有很多都是重复的太浪费了
于是各种乱搞,甚至想了一下分块,即使能减少边的条数也不能减少计算时会走的边的次数
然后看题解,竟然是用倍增来优化
有道理啊,分块太死板了,倍增的话就可以灵活的得到每个区间
$fa[i][j]$表示从i开始$2^j$个数的区间的父亲(也就是和$fa[i][j]$开始$2^j$个数完全相等)
合并的时候从高层往低层合并(j大到小),遇到fa相同就停下
貌似一次合并最坏也是$O(n)$啊
这里卡了我好久. 每层最多合并$n$次,一共$logn$层,没问题啊
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+, P=1e9+;
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n, m, l1, r1, l2, r2;
int fa[N][], Log[N];
int find(int i, int j) {return i==fa[i][j] ? i : fa[i][j]=find(fa[i][j], j);}
void Union(int x, int y, int j) {
int f1=find(x, j), f2=find(y, j);
if(f1==f2) return;
fa[f1][j]=f2;
if(j) Union(x, y, j-), Union(x + (<<(j-)), y+ (<<(j-)), j-);
}
ll Pow(ll a, int b) {
ll ans=;
for(; b; b>>=, a=a*a%P)
if(b&) ans=ans*a%P;
return ans;
} int main() {
freopen("in","r",stdin);
n=read(); m=read();
if(n==) {puts(""); return ;}
Log[]=;
for(int i=; i<=n; i++) Log[i]=Log[i>>]+;
for(int i=; i<=n; i++)
for(int j=; j<=; j++) fa[i][j]=i;
for(int i=; i<=m; i++) {
l1=read(), r1=read(), l2=read(), r2=read();
int t=Log[r1-l1+];
Union(l1, l2, t); Union(r1-(<<t)+, r2-(<<t)+, t);
}
int ans=;
for(int i=; i<=n; i++) ans += find(i, )==i;
printf("%lld\n", *Pow(, ans-)%P);
}
BZOJ 4569: [Scoi2016]萌萌哒 [并查集 倍增]的更多相关文章
- bzoj 4569 [Scoi2016]萌萌哒 并查集 + ST表
题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每 ...
- [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)
[BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...
- Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...
- [bzoj4569][SCOI2016]萌萌哒-并查集+倍增
Brief Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两 ...
- BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...
- 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...
- bzoj 4569: [Scoi2016]萌萌哒
Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的 ...
- LOJ2014 SCOI2016 萌萌哒 并查集、ST表优化连边
传送门 一个朴素的做法就是暴力连边并查集,可是这是\(O(n^2)\)的.发现每一次连边可以看成两个区间覆盖,这两个区间之间一一对应地连边.可线段树对应的两个节点的size可能不同,这会导致" ...
- BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集
好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...
随机推荐
- class 文件反编译器的 java 实现
最近由于公司项目需要,了解了很多关于类加载方面的知识,给项目带来了一些热部署方面的突破. 由于最近手头工作不太忙,同时驱于对更底层知识的好奇与渴求,因此决定学习了一下 class 文件结构,并通过一周 ...
- android弹力效果菜单、组件化项目、电影票选座控件的源码
Android精选源码 android启动扫一扫和收付款的小部件源码 android弹力效果的抽屉菜单源码 对RecyclerView Item做动画 源码 android类似QQ空间,微信朋友圈,微 ...
- Windows系统下文件的概念及c语言对其的基本操作(丙)
- .31-浅析webpack源码之doResolve事件流(2)
放个流程图: 这里也放一下request对象内容,这节完事后如下(把vue-cli的package.json也复制过来了): /* { context: { issuer: '', compiler: ...
- ADO.NET复习总结(4)--访问SqlServer的类
1.连接SqlConnection 2. 3.执行命令SqlCommand 4.数据读取SqlDataReader 注意: ExecuteNonQuery() :执行非查询(增删改) Execute ...
- sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close
打开数据库链接sqlite3_open用法 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sq ...
- MYSQL DISTINCT Optimization
在很多情况下,Distinct和order by的组合需要建立一个内存临时表. 因为distinct关键字可能利用group by,所以了解下mysql如何处理group by有帮助. distin ...
- linux nvme的那些workqueue
目前nvme三个常见的使用的workqueue ,主要有nvme_workq,nvme_rdma_wq ,nvme_fc_wq,下面一一描述一下初始化及使用的场景.分别对应于NVME over PCI ...
- 网口up不起来问题排查
最近处理一个问题,发现有的网口up不起来. ethtool eth6 Settings for eth6: Supported ports: [ FIBRE ] Support ...
- javascript之this
全局作用域的this this == window //true this.a = 8 window.a 一般函数的this function thisTest(){ return this; } t ...