萌萌哒

时间限制: 1 Sec  内存限制: 256 MB
提交: 12  解决: 2
[提交][状态][讨论版]

题目描述

一个长度为 n 的大数,用 S1S2S3...Sn表示,其中 Si表示数的第 i 位, S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1, r1, l2, r2,即两个长度相同的区间,表示子串 Sl1Sl1+1Sl1+2...Sr1与 Sl2Sl2+1Sl2+2...Sr2完全相同。
比如 n = 6 时,某限制条件 l1= 1, r1= 3, l2 = 4, r2 = 6,那么 123123, 351351 均满足条件,但是 12012, 131141不满足条件,前者数的长度不为 6,后者第二位与第五位不同。
问满足以上所有条件的数有多少个

输入

第一行两个数 n 和 m,分别表示大数的长度,以及限制条件的个数
接下来 m 行,对于第 i 行, 有 4 个数 li1, ri1, li2, ri2,分别表示该限制条件对应的两个区间

输出

一个数,表示满足所有条件且长度为 n 的大数的个数,答案可能很大,因此输出答案模 109+7 的结果即可

样例输入

4 2
1 2 3 4
3 3 3 3

样例输出

90

提示

100% 的数据,1 ≤ n ≤ 105, 1 ≤ m ≤ 105, 1 ≤ li1, ri1, li2, ri2≤ n,并且保证 ri1− li1= ri2− li2

【分析】暴力并查集合并肯定超时,考虑倍增的思想,将并查集分层,fa[k][x]表示从x开始的长度为2^k的合并,然后 高位到低位合并即可。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 1e6+;;
const int M = ;
const int mod = 1e9+;
const double pi= acos(-1.0);
typedef pair<int,int>pii;
int n,m,T;
int up[N],go[N],fa[][N];
int findfa(int k,int x){
return x==fa[k][x]?x:fa[k][x]=findfa(k,fa[k][x]);
}
void unionfa(int k,int x,int y){
int X = x,Y = y;
x=findfa(k,x);
y=findfa(k,y);
if(x==y)return;
fa[k][x]=y;
if(!k)return;
unionfa(k-,X,Y);
unionfa(k-,X+(<<k-),Y+(<<k-));
}
int main(){
scanf("%d%d",&n,&m);
for(int j=;j<;j++)for(int i=;i<N;i++)fa[j][i]=i;
for(int i=,l1,r1,l2,r2;i<m;i++){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(l1>l2){
swap(l1,l2);swap(r1,r2);
}
int k=log2(r1-l1+);
unionfa(k,l1,l2);unionfa(k,r1-(<<k)+,r2-(<<k)+);
}
int cnt=;
ll ans=;
for(int i=;i<=n;i++){
if(findfa(,i)==i)cnt++;
}
for(int i=;i<cnt-;i++){
ans=ans*%mod;
}
if(n==)puts("");
else printf("%lld\n",ans);
return ;
}

四川oi 萌萌哒 (分层并查集)的更多相关文章

  1. 【BZOJ4569】萌萌哒(并查集,倍增)

    [BZOJ4569]萌萌哒(并查集,倍增) 题面 BZOJ 题意: 有一个长度为\(n\)的数 给定\(m\)个限制条件 每次限制\(l1-r1\)与\(l2-r2\)是相同的 求出方案数 题解 如果 ...

  2. 【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集

    [BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四 ...

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

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

  4. 2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)

    传送门 对于每个限制,使用倍增的二进制拆分思想,用并查集数组fa[i][j]" role="presentation" style="position: rel ...

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

    首先有一个显然的$O(n^2)$暴力做法,将每个位置看成点,然后将所有限制相等的数之间用并查集合并,最后答案就是9*(10^连通块的个数).(特判n=1时就是10). 然后比较容易想到的是,由于每次合 ...

  6. BZOJ4569 [SCOI2016]萌萌哒 【并查集 + 倍增】

    题目链接 BZOJ4569 题解 倍增的思想很棒 题目实际上就是每次让我们合并两个区间对应位置的数,最后的答案\(ans = 9 \times 10^{tot - 1}\),\(tot\)是联通块数, ...

  7. BZOJ4569 [Scoi2016]萌萌哒(并查集,倍增)

    类似\(ST表\)的思想,倍增\(log(n)\)地合并 你是我家的吗?不是就来呀啦啦啦.还有要来的吗?没了!那有多少个家就映射多少答案呀 倍增原来这么好玩 #include <iostream ...

  8. 【BZOJ-4569】萌萌哒 ST表 + 并查集

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 459  Solved: 209[Submit][Status] ...

  9. 【BZOJ 4569】 4569: [Scoi2016]萌萌哒 (倍增+并查集)

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 865  Solved: 414 Description 一个长 ...

随机推荐

  1. vijos 1002 简单压缩+DP

    描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上 ...

  2. PAT (Top Level)1002. Business DP/背包

    As the manager of your company, you have to carefully consider, for each project, the time taken to ...

  3. [USACO13FEB]出租车Taxi

    洛谷题目链接:[USACO13FEB]出租车Taxi 题目描述 Bessie is running a taxi service for the other cows on the farm. The ...

  4. Jenkenis报错:该jenkins实例似乎已离线[转]

    解决方法: 安装插件那个页面,就是提示你offline的那个页面,不要动.然后打开一个新的tab,输入网址http://localhost:8080/pluginManager/advanced. 这 ...

  5. Jumpserver代码规范

    Jumpserver 项目规范(Draft) 语言框架 Python 3.6.1 (当前最新) Django 1.11 (当前最新) Flask 0.12 Luna (当前最新) Paramiko 2 ...

  6. ECMAScript5中新增的Array方法实例详解

    ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.(注意兼容性) 在ES5中,一共有9个Array方法:http://kangax.githu ...

  7. bzoj 2733 平衡树启发式合并

    首先对于一个连通块中,询问我们可以直接用平衡树来求出排名,那么我们可以用并查集来维护各个块中的连通情况,对于合并两个平衡树,我们可以暴力的将size小的平衡树中的所有节点删掉,然后加入大的平衡树中,因 ...

  8. ribbon设置url级别的超时时间

    序 ribbon的超时设置,只能按转发的serviceId来分的,无法像nginx那样直接在每个转发的链接里头设置超时时间.这里hack一下,实现url基本的ribbon超时时间设置.具体的思路就是重 ...

  9. Msfvenom学习总结-MSF反弹webshell

    1.    –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...

  10. python之提速千倍爆破一句话

    看了一下冰河大佬写的文章特别有感:https://bbs.ichunqiu.com/thread-16952-1-1.html 简单描述一下: 利用传统的单数据提交模式. 比如下面这个一句话木马: & ...