传送门

题意:长为$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]萌萌哒 [并查集 倍增]的更多相关文章

  1. bzoj 4569 [Scoi2016]萌萌哒 并查集 + ST表

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

  2. [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)

    [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...

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

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

  4. [bzoj4569][SCOI2016]萌萌哒-并查集+倍增

    Brief Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两 ...

  5. BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集

    传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...

  6. 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边

    题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...

  7. bzoj 4569: [Scoi2016]萌萌哒

    Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的 ...

  8. LOJ2014 SCOI2016 萌萌哒 并查集、ST表优化连边

    传送门 一个朴素的做法就是暴力连边并查集,可是这是\(O(n^2)\)的.发现每一次连边可以看成两个区间覆盖,这两个区间之间一一对应地连边.可线段树对应的两个节点的size可能不同,这会导致" ...

  9. BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集

    好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...

随机推荐

  1. 2017ecjtu-summer training #11 POJ 1018

    Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29218   Accepted:  ...

  2. hdu_1014(竟然真的还有更水的)

    注意输出就没了... #include<cstdio> #include<cstring> using namespace std; int gcd(int a, int b) ...

  3. c语言基础学习07_关于指针的复习

    ============================================================================= 指针变量之间赋值是需要兼容的. 例如:int ...

  4. jqgrid 分页 (基于ashx)

    1:数据库表创建并往中插入200000条数据: 复制代码 CREATE TABLE [dbo].[T_School]( [ID] [int] IDENTITY(1,1) NOT NULL, [Scho ...

  5. Eclipse集成Tomcat的步骤,我已测试N次都是成功的

    本文转自:https://www.cnblogs.com/weixing/p/3229983.html#undefined 使用Eclipse开发B/S结构Web应用时,必须使用Web应用服务器,常见 ...

  6. phpfpm配置 php中的坑

    ###### 记一些坑```//phpfpm配置pm.max_children = 最大并发数详细的答案:pm.max_children 表示 php-fpm 能启动的子进程的最大数量.因为 php- ...

  7. ecshop商城_

    一.Ecshop简介: ECShop是Comsenz公司推出的一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店.系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序. ECSho ...

  8. ADO.NET复习总结(2)--连接池

    1. 2. 3.示例:在一百次循环中,执行数据库连接的打开和关闭,使用stopwatch查看所用的时间. using System; using System.Collections.Generic; ...

  9. iptables nat及端口映射

    iptables nat及端口映射 发布: 2010-6-11 15:05 | 作者: admin | 来源: SF NetWork 门户网站 iptables 应用初探(nat+三层访问控制) ip ...

  10. Java线程-异常处理

    在Java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Run ...