洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)
思路太妙了啊……
容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0)
考虑倍增。我们设$f[i][j]$表示区间$[i,i+2^j-1]$,那么我们可以把原区间给拆成$log$个区间,然后维护这些区间的连通性
然而我们最后需要的是最底层的,也就是单独的节点的连通性。那么我们考虑如何将连通性向下传递。如果$f[i][j]$和$f[a][b]$连通,那么$f[i][j-1]$和$f[a][b-1]$一定连通(前半部分区间),$f[i+2^{j-1}][j-1]$和$f[a+2^{b-1}][b-1]$也一定连通
ps:连通性肯定都在同一层,所以实际上上面的$j$和$b$一般都是相等的
然后只要最后判最底层有几个并查集就好了
//minamoto
#include<iostream>
#include<cstdio>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=1e5+,mod=1e9+;
int fa[N*],id[N][],num[N*],log[N*],bin[],is[N*],h[N*],tot=,cnt;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int x,int y){
x=find(x),y=find(y);
if(h[x]<h[y]) fa[x]=y;
else if(h[x]>h[y]) fa[y]=x;
else fa[x]=y,++h[y];
}
int ksm(int b){
int res=,a=;
while(b){
if(b&) res=1ll*res*a%mod;
a=1ll*a*a%mod,b>>=;
}
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
int n=read(),m=read();
bin[]=;for(int i=;i<=;++i) bin[i]=bin[i-]<<;
for(int j=;j<=;++j) for(int i=;i<=n;++i) id[i][j]=++tot,num[tot]=i,fa[tot]=tot,h[tot]=;
while(m--){
int l1=read(),r1=read(),l2=read(),r2=read();
for(int i=;i>=;--i) if(l1+bin[i]-<=r1){
merge(id[l1][i],id[l2][i]),l1+=bin[i],l2+=bin[i];
}
}
for(int j=;j;--j) for(int i=;i+bin[j]-<=n;++i){
int x=find(id[i][j]),a=num[x];
merge(id[a][j-],id[i][j-]),merge(id[a+bin[j-]][j-],id[i+bin[j-]][j-]);
}
for(int i=;i<=n;++i)
if(find(id[i][])==id[i][]) ++cnt;
printf("%d\n",ksm(cnt-));
return ;
}
洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)的更多相关文章
- 洛谷P3295 [SCOI2016]萌萌哒 题解
洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同 ...
- 【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集
[BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四 ...
- [SCOI2016]萌萌哒(倍增+并查集)
一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1 ...
- [BZOJ4569][SCOI2016]萌萌哒(倍增+并查集)
首先有一个显然的$O(n^2)$暴力做法,将每个位置看成点,然后将所有限制相等的数之间用并查集合并,最后答案就是9*(10^连通块的个数).(特判n=1时就是10). 然后比较容易想到的是,由于每次合 ...
- 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...
- 2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)
传送门 对于每个限制,使用倍增的二进制拆分思想,用并查集数组fa[i][j]" role="presentation" style="position: rel ...
- BZOJ4569 [SCOI2016]萌萌哒 【并查集 + 倍增】
题目链接 BZOJ4569 题解 倍增的思想很棒 题目实际上就是每次让我们合并两个区间对应位置的数,最后的答案\(ans = 9 \times 10^{tot - 1}\),\(tot\)是联通块数, ...
- Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)
题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...
- 洛谷1525 关押罪犯NOIP2010 并查集
问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...
随机推荐
- 从零开始写STL-二叉搜索树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- topcoder 650 srm
500 遇到这种构造题 就给跪了 比赛的时候想很多方法 DP,贪心,模拟 发现越写越烦琐.看到别人出这么快,肯定又是奇葩思路. 后来居然想到 2^50的暴力 +剪枝 不过暴力肯定卡你 IDEA: 只要 ...
- foobar2000 iOS使用,并连接PC的歌曲进行播放
foobar2000移动版下载地址:http://mobile.foobar2000.com/ 要实现歌曲互通有两种方法,使用iOS客户端的FTP Server用PC上传歌曲到iOS手机,和在PC上使 ...
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...
- Spring MVC 异步处理请求,提高程序性能
原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能? 一个普通 Servle ...
- Web容器自己主动对HTTP请求中參数进行URLDecode处理
这篇文章转载自 : Web容器自己主动对HTTP请求中參数进行URLDecode处理 如题.在Java中或许非常多人都没有注意到当我们发送一个http请求时,假设附带的參数被URLEncode之后,到 ...
- Android中AsyncTask使用具体解释
在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handl ...
- 各项异性滤波简单介绍Anisotropic Filtering(AF)
本文主要整理简绍来自互联网的各项异性滤波的知识. 原文链接:http://www.linuxgraphics.cn/graphics/using_anisotropic_texture_filteri ...
- 关于disable和readonly
我们在做网页时,难免的会因为权限或者各种原因,想让使用者看到,但是却不想让用户去对值进行更改,我们有两个选择 一.我们使用disabled将文本框禁用掉. 二.我们使用readonly使得文本框只能读 ...
- jQuery选择器特殊字符与属性空格问题
一.选择器中含有特殊符号的注意事项 1.选择器中含有“.”.“#”.“(”或“]”等特殊字符 根据W3C的规定,属性值中是不能含有这些特殊字符的,但在实际项目中偶尔会遇到表达式中含有“#”和“.”等特 ...