【BZOJ-4569】萌萌哒 ST表 + 并查集
4569: [Scoi2016]萌萌哒
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 459 Solved: 209
[Submit][Status][Discuss]
Description
Input
Output
一个数,表示满足所有条件且长度为n的大数的个数,答案可能很大,因此输出答案模10^9+7的结果即可。
Sample Input
1 2 3 4
3 3 3 3
Sample Output
HINT
Source
Solution
这道题非常巧妙
先思考暴力,对每一位维护一个并查集,每次限制就是把那两个区间信息合并,最后答案根据剩有的计算即可
那么问题在于如何快速的合并
考虑线段树,分出来的区间过多,合并还是有问题,所以换种方法
倍增!建立ST表,相当于对同层的建出一棵类似树的东西,每层维护并查集,相当于把信息拆成$2^{?}$的两段
合并优先合并大的,这样一共是$nlogn$段,最多合并$nlogn$次
递归合并,发现合并过就可以跳出了,总的答案统计一下用快速幂计算一下即可
特判N=1
总的时间复杂度$O(nlogn*a(n))$
启发:倍增并不仅仅应用于LCA或SA求LCP之类的,应该灵活运用这种思想
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
void Freopen() {freopen("game.in","r",stdin); freopen("game.out","w",stdout);}
#define P 1000000007
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int N,M;
long long Quick_Pow(long long x,long long y)
{
long long re=;
for (int i=y; i; i>>=,x=x*x%P)
if (i&) re=re*x%P;
return re;
}
#define MAXN 100010
int fa[MAXN][];
int Find(int x,int y) {if (fa[x][y]==x) return x; else return fa[x][y]=Find(fa[x][y],y);}
void Merge(int x1,int x2,int k)
{
int f1=Find(x1,k),f2=Find(x2,k);
if (f1==f2) return;
fa[f1][k]=f2;
if (k--) {Merge(x1,x2,k),Merge(x1+(<<k),x2+(<<k),k);}
}
int Len;
int main()
{
Freopen();
N=read(),M=read();
for (int i=; i<=N; i++)
for (int j=; j<=; j++)
fa[i][j]=i;
while (M--)
{
int l1=read(),r1=read(),l2=read(),r2=read();
int k=; while ((<<k)<=r1-l1+) k++; k--;
Merge(l1,l2,k); Merge(r1-(<<k)+,r2-(<<k)+,k);
}
for (int i=; i<=N; i++) if (fa[i][]==i) Len++;
printf("%d\n",N==? :int(9LL*Quick_Pow(,Len-)%P));
return ;
}
【BZOJ-4569】萌萌哒 ST表 + 并查集的更多相关文章
- BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...
- BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集
好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...
- bzoj4569: [Scoi2016]萌萌哒(ST表+并查集)
好喵喵的题 将一个要求用ST表分割成logn个要求,如果把f[i][j]和f[u][v]在同一个集合,那么f[i][j-1]和f[u][v-1],f[i+2^(j-1)][j-1]和f[u][u+2^ ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- BZOJ.2054.疯狂的馒头(并查集)
BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400 ...
- 2021.08.03 BZOJ 疯狂的馒头(并查集)
2021.08.03 BZOJ 疯狂的馒头(并查集) 疯狂的馒头 - 题目 - 黑暗爆炸OJ (darkbzoj.tk) 重点: 1.并查集的神奇运用 2.离线化 题意: 给一个长为n的序列,进行m次 ...
- 【BZOJ 4569】 4569: [Scoi2016]萌萌哒 (倍增+并查集)
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 865 Solved: 414 Description 一个长 ...
- BZOJ 4569 萌萌哒
题目传送门 4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 483 Solved: 221 [Submit][S ...
- BZOJ4569 SCOI2016萌萌哒(倍增+并查集)
一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...
随机推荐
- iptables详细说明
一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙 ...
- PAT 1006. 换个格式输出整数 (15)
让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例 ...
- BZOJ 1024 【SCOI2009】 生日快乐
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- SharePoint 2013无代码实现列表视图的时间段动态筛选
本文介绍两种为列表视图设置时间段筛选器的方法.其中,第一个方法用于SharePoint Server,第二个方法同时还能用于SharePoint Foundation. 方法一:日期筛选器Web部件 ...
- Linux常用命令笔记
~ 我的home目录/ 系统根目录进入home目录:cd \进入跟目录:cd /Maven编译:mvn clean deploy -U -Dmaven.test.skip=true dependenc ...
- Linux socket多进程服务器框架二
客户端未解决Bug:子进程或者父进程退出的时候,我无法做到两个进程都调用clt_socket_Destory()方式释放socket句柄, 但是进程退出后,相应的资源也会释放,有一定影响,但是不大,以 ...
- Linux shell文本过滤
正则表达式 --概念:一种用来描述文本模式的特殊语法 --由普通字符(例如:字符a到z),以及特殊字符(元字符,如/*?等)组成匹配的字符串 --文本过滤工具在某种模式之下,都支持正则表达式 --基本 ...
- Linux shell基础
shell是核心程序kernel之外的指令解析器,是一个程序,同事是一种命令语言和程序设计语言 --shell是命令解析器,用户输入命令,它去解析. shell类型 ash,bash,ksh,csh, ...
- 建立mvc过程
1.public class dbContext:Dbcontext { private readonly static string CONNECTION_STRING="name=d ...
- javascript: 带分组数据的Table表头排序
如下图: 要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变 从网上找了一段常规的table排序,改了改,以满足“分组支持”,贴在这里备份 < ...