传送门

对于每个限制,使用倍增的二进制拆分思想,用并查集数组fa[i][j]" role="presentation" style="position: relative;">fa[i][j]fa[i][j]表示从i" role="presentation" style="position: relative;">ii开始,延伸2j" role="presentation" style="position: relative;">2j2j的区间所属的集合,这样的话,我们将所有限制拆分过后,从上向下传递标记直到长度为1" role="presentation" style="position: relative;">11的区间,最后统计有多少长度为1" role="presentation" style="position: relative;">11的区间的祖先是自己即可。

代码:

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int fa[100005][25],cnt=-1,n,m,l1,r1,l2,r2;
inline int find(int x,int y){return fa[x][y]==x?fa[x][y]:fa[x][y]=find(fa[x][y],y);}
inline void merge(int x,int y,int l){int fx=find(x,l),fy=find(y,l);if(fx!=fy)fa[fx][l]=fy;}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)for(int j=0;j<=20;++j)fa[i][j]=i;
    while(m--){
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        for(int i=20;~i;--i)if(l1+(1<<i)<=1+r1)merge(l1,l2,i),l1+=(1<<i),l2+=(1<<i);
    }
    for(int i=20;i;--i)
        for(int j=1;j+(1<<i)<=1+n;++j)merge(j,find(j,i),i-1),merge(j+(1<<i-1),fa[j][i]+(1<<i-1),i-1);
    long long ans=9;
    for(int i=1;i<=n;++i)if(find(i,0)==i)++cnt;
    while(cnt--)ans=ans*10%mod;
    printf("%lld",ans);
    return 0;
}

2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)的更多相关文章

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

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

  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. BZOJ 4569: [Scoi2016]萌萌哒 [并查集 倍增]

    传送门 题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数 把所有要求相等的位置连起来,不就是$9*10^{连通 ...

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

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

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

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

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

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

  8. BZOJ4569 SCOI2016萌萌哒(倍增+并查集)

    一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...

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

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

随机推荐

  1. as3 判断移动方向

    var oldX:Number; stage.addEventListener(MouseEvent.MOUSE_DOWN,downF); stage.addEventListener(MouseEv ...

  2. javaEncode

    1.MD5加密 md5多用于用户密码加密或者签名使用,因md5不可逆,可用于身份验证. MessageDigest md5=MessageDigest.getInstance("MD5&qu ...

  3. 科比投球预测-python实例

    链接:http://pan.baidu.com/s/1i4PNJlr 密码:fz7e import matplotlib.pyplot as pltfig = plt.figure()ax1 = fi ...

  4. 将Delphi的对象方法设为回调函数

    心血来潮,为了实现更好的通用性和封装性,需要把类方法作为回调函数,搜得一篇好文,节选转发.命名似乎应该是MethodToCallback才合适,可惜调试时总是报错,debugging. 原文地址:ht ...

  5. python 刷题必备

    1.判断输入的数字是否是回文数: 学习内容:把数字转成字符串 1. def is_palindrome(n): n=str(n) m=n[::-1] return n==m 2. tmp_str = ...

  6. webservice jaxws header验证

    @WebService @HandlerChain public class UserService { ... } package com.xx.ws.header; import org.w3c. ...

  7. Unicode、UTF8与UTF16

    1 概念 Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案 UTF是“Unicode Transformation Format”的缩写,可以翻译成Unicode字符集转换格式 ...

  8. SpringBoot中使用Redis

    在SpringBoot中使用Redis,思路如下: 查询时先查Redis缓存,如果缓存中存在信息,就直接从缓存中获取. 如果缓存中没有相关信息,就去数据库中查找,查完顺便将信息存放进缓存里,以便下一次 ...

  9. repeater嵌套RadioButtonList赋值

    <asp:Repeater ID="Repeater1" runat="server"         onitemdatabound="Rep ...

  10. session以及分布式服务器session共享

    一.session的本质 http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录 ...