一个显然的暴力是用并查集记录哪些位之间是相等的。但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多。

  于是考虑优化。使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][j]~f[i][j]+2^j-1连接起来了,也就是把这一大段看成一个点所建立的并查集。那么每个限制只要拆成两段就可以了。最后查询的时候,需要把信息下传,即f[i][j]下传到f[i][j-1]和f[i+2^(j-1)][j-1],表示这两段各自分别对应。于是复杂度变成了O(nlognαn)。这个做法能优化复杂度的关键在于每次下传过程中都去除了一些冗余边使其不再会下传了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
#define P 1000000007
int n,m,fa[N][],lg2[N],ans=;
int find(int x,int j){return fa[x][j]==x?x:fa[x][j]=find(fa[x][j],j);}
void merge(int x,int y,int k){fa[find(x,k)][k]=find(y,k);}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4569.in","r",stdin);
freopen("bzoj4569.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
for (int j=;j<=;j++)
fa[i][j]=i;
lg2[]=;
for (int i=;i<=n;i++)
{
lg2[i]=lg2[i-];
if ((<<lg2[i])<=i) lg2[i]++;
}
for (int i=;i<=m;i++)
{
int l1=read(),r1=read(),l2=read(),r2=read();
merge(l1,l2,lg2[r1-l1+]);
merge(r1-(<<lg2[r1-l1+])+,r2-(<<lg2[r1-l1+])+,lg2[r1-l1+]);
}
for (int j=;j>=;j--)
for (int i=;i<=n;i++)
if (fa[i][j]!=i) merge(i,fa[i][j],j-),merge(i+(<<j-),fa[i][j]+(<<j-),j-);
for (int i=;i<=n;i++) if (find(i,)==i) ans++;
int t=;
for (int i=;i<=ans;i++) t=10ll*t%P;
cout<<t;
return ;
}

BZOJ4569 SCOI2016萌萌哒(倍增+并查集)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 洛谷P3295 萌萌哒 [SCOI2016] 倍增+并查集

    正解:倍增+并查集 解题报告: 传送门! 首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣 然后看下复杂度,修改是O(n2)查询是O(n),就比较容易 ...

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

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

随机推荐

  1. Selenium:三种等待方式

    UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作.但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1.有frame:2.没有设置等待. 因为代码运行速度和 ...

  2. 用c#开发微信 系列汇总 - z

    http://www.cnblogs.com/txw1958/ http://www.cnblogs.com/fengwenit/p/4505062.html

  3. Flutter - 退出App

    Flutter退出App的方法一般有两种 ①SystemNavigator.pop 推荐 onTap: () async { await pop(); }, static Future<void ...

  4. 2-Twenty First Scrum Meeting-20151221

    任务安排 成员 今日完成 明日任务 闫昊 请假(数据库)   唐彬 请假(数据库)   史烨轩  尝试使用downloadmanager对notification进行更新  尝试使用downloadm ...

  5. Linux内核分析作业第六周

    创建新进程的过程 一.进程的描述 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 1.进程控制块PCB——task_struct 操作系统的三大管理功能 进程 ...

  6. 冲刺Two之站立会议10

    今天是最后一次站立会议,我们为自己软件最终版的发布进行了讨论,针对项目开发过程中出现的问题进行了总结.并讨论了之后软件如何发布和推广.

  7. Post Tuned Hashing,PTH

    [ACM 2018] Post Tuned Hashing_A New Approach to Indexing High-dimensional Data [paper] [code] Zhendo ...

  8. ABP编译必须添加对程序集“netstandard, Version=2.0.0.0错误

    当前使用ABP版本为:4.6.0 升级vs2017到15.4版本,升级framework到4.7版本 如果Core版本请升级到net core 2

  9. Jfrog 与 jenkins Sonarqube的 测试样例 (From jfrog 培训)

    1. 获取jfrog 仓库地址 sonar的地址 jenkins的地址. 本次例子的地址为: jenkins地址:http://10.24.101.99:8080/ artifactory地址: ht ...

  10. [转帖]召冠总的 SQLSERVER常用的性能诊断语句. --保存学习备查

    CopyFrom https://www.cnblogs.com/zhaoguan_wang /*常规服务器动态管理对象包括:dm_db_*:数据库和数据库对象dm_exec_*:执行用户代码和关联的 ...