2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)
传送门
对于每个限制,使用倍增的二进制拆分思想,用并查集数组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]萌萌哒(并查集+倍增)的更多相关文章
- [bzoj4569][SCOI2016]萌萌哒-并查集+倍增
Brief Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两 ...
- [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)
[BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...
- Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...
- BZOJ 4569: [Scoi2016]萌萌哒 [并查集 倍增]
传送门 题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数 把所有要求相等的位置连起来,不就是$9*10^{连通 ...
- LOJ2014 SCOI2016 萌萌哒 并查集、ST表优化连边
传送门 一个朴素的做法就是暴力连边并查集,可是这是\(O(n^2)\)的.发现每一次连边可以看成两个区间覆盖,这两个区间之间一一对应地连边.可线段树对应的两个节点的size可能不同,这会导致" ...
- 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...
- bzoj 4569 [Scoi2016]萌萌哒 并查集 + ST表
题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每 ...
- BZOJ4569 SCOI2016萌萌哒(倍增+并查集)
一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...
- [BZOJ4569][SCOI2016]萌萌哒(倍增+并查集)
首先有一个显然的$O(n^2)$暴力做法,将每个位置看成点,然后将所有限制相等的数之间用并查集合并,最后答案就是9*(10^连通块的个数).(特判n=1时就是10). 然后比较容易想到的是,由于每次合 ...
随机推荐
- js改变div高度
用bootsrap响应式布局的时候,遇到个很恶心的问题:左边栏很短很难看!! 于是,想用js来自动改变左边的高度,没成功!!原来是设置的时候,没加单位,坑爹了. 参考:http://blog.sina ...
- background-image,background-repeat, background-position 实现点赞图片(一个图片的多次使用)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jsfl 巧用获取jsfl绝对路径,导入配置文件,注意配置文件无法改变舞台宽高
//获取jsfl下的AS3.xml配置文件的路径 var jsflURL_arr=fl.scriptURI.split("/"); jsflURL_arr.splice(jsflU ...
- as3 判断移动方向
var oldX:Number; stage.addEventListener(MouseEvent.MOUSE_DOWN,downF); stage.addEventListener(MouseEv ...
- python list()总结
# 1 列表的创建,用方括号表示[ ] name=['xiaolei','xiaoman','lixia','xiaolei'] # 2 列表的查询,通过索引值差值,第一位索引为0 #倒数第一个 ...
- UI5-文档-4.34-Custom Controls
在这一步中,我们将使用自定义控件扩展SAPUI5的功能.我们希望对详细页面上显示的产品进行评级,因此我们使用SAPUI5扩展机制创建了多个标准控件的组合,并添加了一些粘合代码以使它们能够很好地一起工作 ...
- vue 解决报错1
[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available ...
- (转载)session token机制
http://blog.chinaunix.net/uid-26642709-id-3061264.html 使用session token时,必须用struts2表标签库,不能用html 通过ses ...
- CGBitmapContextCreate函数参数详解 以及在 ios7下变化
函数原型: CGContextRef CGBitmapContextCreate ( void *data, size_t width, size_t height, size_t ...
- js中函数的使用方式及回调函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...