题目:https://www.luogu.org/problemnew/show/P3295

当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边。

在连边的时候,如果要连的区间已经有一部分连成这个样子了,就希望跳过这一段。

想倍增那样跳过已经连好的部分。用并查集实现。

建 logn 个并查集,第 i 个并查集里 x 和 y 连通表示 \( [x,x+2^i-1] \) 和 \( [y,y+2^i-1] \) 已经连成了的样子。

那么要连 \( [l1,r1] \) 和 \( [l2,r2] \) 的时候,用 RMQ 的思想把它拆成连 \( [l1,l1+bin[k]-1] \) 和 \( [l2,l2+bin[k]-1] \) 与连 \( [r1-bin[k]+1,r1] \) 和 \( [r2-bin[k]+1,r2] \) 两次操作(其中 bin[k] 是 小于等于 (r-l+1) 的最大的2的整次幂);在第 t 层的并查集连的时候,如果该层的 x 和 y 已经连通,就直接返回;不然就连通该层的 x 和 y ,然后递归进 t-1 层连;递归的时候会分裂成两部分,即 \( mrg(t-1,l,r) \) 和 \( mrg(t-1,l+bin[t-1],r+bin[t-1]) \) 。

这样就跳过了已经连好的部分。最后的真实连通情况就是第 0 层的情况。

每层并查集最多连 n 次,所以均摊复杂度 nlogn 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+,K=,mod=1e9+;
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;} int n,m,lg[N],bin[K],fa[K][N];
int fnd(int t,int a)
{return fa[t][a]==a?a:fa[t][a]=fnd(t,fa[t][a]);}
void mrg(int t,int x,int y)
{
int u=fnd(t,x), v=fnd(t,y);
if(u!=v)
{
fa[t][u]=v;
if(!t)return;
mrg(t-,x,y); mrg(t-,x+bin[t-],y+bin[t-]);
}
}
int main()
{
n=rdn();m=rdn();
for(int i=;i<=n;i++)lg[i]=lg[i>>]+;
bin[]=;for(int i=;i<=lg[n];i++)bin[i]=bin[i-]<<;
for(int t=;t<=lg[n];t++)
for(int i=;i<=n;i++)fa[t][i]=i;
for(int i=,l1,r1,l2,r2,d,t;i<=m;i++)
{
l1=rdn();r1=rdn();l2=rdn();r2=rdn();
d=lg[r1-l1+]; r1=r1-bin[d]+; r2=r2-bin[d]+;
mrg(d,l1,l2); mrg(d,r1,r2);
}
int cnt=;
for(int i=;i<=n;i++)if(fnd(,i)==i)cnt++;
printf("%lld\n",(ll)*pw(,cnt-)%mod);
return ;
}

洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边的更多相关文章

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

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

  2. 洛谷P3295 [SCOI2016]萌萌哒 题解

    洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同 ...

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

    传送门 思路太妙了啊…… 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...

  4. bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集

    题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...

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

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

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

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

  7. 洛谷P2024 食物链 [NOI2001] 并查集

    正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...

  8. 洛谷P1197 [JSOI2008] 星球大战 [并查集]

    题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...

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

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

随机推荐

  1. C点滴成海------Ubuntu怎么运行C语言

    Ubuntu怎么运行C语言 一.安装相关软件 安装vim:输入 sudo apt-get install vim: 安装gcc:输入 sudo apt-get install g++. 二.编写代码 ...

  2. Linux运维命令总结(-)

    Linux运维命令总结(-)  此次整理linux运维常用命令13个,常用linux运维命令大概有150个,约占百分之十,大牛见笑,本人菜鸟一枚不才整理如下,如有不正确之处,请多多指正. 1.创建目录 ...

  3. 2019-03-15-day011-递归生成器

    函数的进阶: 动态参数: 两种: 动态位置参数 > 动态默认参数 打散(聚合): 实参处打散 形参处聚合 不在函数中第一次使用*打散,第二次是聚合 在数据库中快速写入数据的时候,**dic 名称 ...

  4. vue--http请求的封装--session

    export function Fecth (url, data, file, _method) { if (file) { // 需要上传文件 return new Promise((resolve ...

  5. 【转载】 DeepMind用ReinforcementLearning玩游戏

    原文地址: https://blog.csdn.net/wishchin/article/details/42425145 原文 :  http://dataunion.org/?p=639 1.引言 ...

  6. Linux不在显示器上方总是显示企鹅

    /********************************************************************************* * Linux不在显示器上方总是显 ...

  7. Java栈的简单实现

    * 数据结构与算法Java实现 栈 * * @author 小明 * */ public class MyStack { private Node top;// 头指针 int size;// 长度 ...

  8. Unity查找物体的子物体、孙物体

    Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  9. poj 2253——Frogger

    这个题一开始不知道咋做,但是大致有点意思.后来还是借鉴了题解发现可以用dijkstra,不太理解.但是在最后自己推的时候突然理解了. dijkstra应该也算是动态规划.我们用dis[i]数组作为青蛙 ...

  10. cf——Sasha and a Bit of Relax(dp,math)

    关于异或运算,是可以求前缀和的.还有一些异或运算的性质 0^a=a; 交换律 a^b=b^a 结合律 a^(b^c)=(a^b)^c 分配率 a^(b+c)=a^b+a^c 自反律 a^b^b=a 判 ...