传送门

分析

我们可以将一个点拆成logN个点,分别代表从点i开始,长度为2^k的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成log个区间,分别并起来即可

当然我们这样做修改是省心了,但是同时查询的时候也会带来一些麻烦……因为,我们要求的信息是最底层的,只能是长度为1的区间,而不能有奇奇怪怪的区间 不过没关系,我们这时运用等式1,拆分并查集

具体来讲,我们从最长的区间开始逐个枚举,每次查找他和他的父亲,然后把它和父亲都劈成两半,前一半和前一半连边,后一半和后一半连边即可,这样相当于把较长区间并查集拆成两个一半的并查集

最后我们就有了一些关于那些点相等的信息,直接计算并查集个数即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int mod = 1e9+7;
const int LOG = 20;
int fa[LOG+2][100010],n,m,l1,l2,r1,r2,cnt;
long long Ans=9;
inline int sf(int x,int y){return fa[y][x]==x?x:fa[y][x]=sf(fa[y][x],y);}
inline void mer(int x,int y,int k){if(sf(x,k)!=sf(y,k))fa[k][sf(x,k)]=sf(y,k);}
int main(){int i,j,k;scanf("%d%d",&n,&m);for(i=0;i<=LOG;i++)for(j=1;j<=n;j++)fa[i][j]=j;for(i=1;i<=m;i++){scanf("%d%d%d%d",&l1,&r1,&l2,&r2);for(j=LOG;j>=0;j--)if(l1+(1<<j)-1<=r1){mer(l1,l2,j);l1+=(1<<j);l2+=(1<<j);}}for(i=LOG;i>0;i--)for(j=1;j+(1<<i)-1<=n;j++){mer(j,sf(j,i),i-1);mer(j+(1<<(i-1)),fa[i][j]+(1<<(i-1)),i-1);}for(i=1;i<=n;i++)if(sf(i,0)==i)cnt++;for(i=1;i<cnt;i++)Ans=Ans*10%mod;cout<<Ans;return 0;
}

转载于:https://www.cnblogs.com/yzxverygood/p/10354458.html

p3295 [SCOI2016]萌萌哒相关推荐

  1. P3295 [SCOI2016]萌萌哒(DP+倍增)

    P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结 ...

  2. 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)

    传送门 思路太妙了啊-- 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...

  3. luogu P3295 [SCOI2016]萌萌哒

    传送门 题目条件"两个子串\(S[l_1,r_1],S[l_2,r_2]\)完全相同"等价于\(\forall i \in[0,r_1-l_1+1],S_{l1+i}=S_{l_2 ...

  4. BZOJ4569: [Scoi2016]萌萌哒

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 961  Solved: 464 [Submit][Statu ...

  5. bzoj4569 [Scoi2016]萌萌哒 并查集+st表

    这个题非常巧妙,它描述了一种新的延迟标记关系.. 正常的线段树是用n*4的空间描述一个序列,所以对于一段区间,有可能会有log个点对应一个点 而线段树是利用尽量小的空间使查询变为log st表是nlo ...

  6. bzoj4569[Scoi2016]萌萌哒

    Description 给出一个有n位的无前导0正整数,再给出m个限制,每个限制形如l1-r1,l2..r2表示这个数的l1~r1位和第l2~r2位是相等的.求这样的数的个数. n,m<=10^ ...

  7. [bzoj4569][SCOI2016]萌萌哒

    题目大意 有一个无前导0的n位数,有m个限制形如[l1,r1]=[l2,r2],问满足条件的数有多少种,答案模10^9+7. 倍增 我们用ST表,f[i,j]表示[i,i+2^j-1]这一段. 那么初 ...

  8. BZOJ4569 [Scoi2016]萌萌哒

    一眼觉得是并查集,yy了一下线段树优化发现不可sing,orz了ljss神犇被告知是倍增优化 倍增,一个点[i][j]代表某个i往后2^j个数,把点按倍增次数分层,两个同层的点在一个连通块说明两个点所 ...

  9. bzoj4569【SCOI2016】萌萌哒

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 403   Solved: 176 [ Submit][ S ...

最新文章

  1. mac 系统安装总结
  2. 设计模式之Composite
  3. Java 第27章 JDBC
  4. c++对象模型-虚拟析构函数
  5. [博客园公告]编辑器改进(二)
  6. intern()方法的使用
  7. php 编写mysql_php编写数据写入mysql问题
  8. Golang Tips
  9. 名校计算机课程百度云,浙江大学计算机类专业视频课程百度云网盘
  10. Github上开源的数据可视化工具及作品分享(一)
  11. navicat如何连接本地数据库
  12. 【大咖周刊】Linus 在谷歌介绍 Git、IBM340亿收购小红帽、IDE Visual Studio 开始支持 Java 了...
  13. TCSVT论文结构整理
  14. 从发不起工资到融资1650万,逸创创始人叶翔如何熬过来的?
  15. matlab里添加白噪声,转Matlab中添加高斯白噪声
  16. 订餐系统实验报告java_订餐系统的java实训报告.ppt
  17. 详细过程MD5加密的原理+java实现
  18. 传统贸易企业数字化管理
  19. java运行库未能修复,如何修复Microsoft Visual Studio错误:“程序包未正确加载”?...
  20. C#-linq实战003-查询-Where

热门文章

  1. 【数据库】基础知识总结
  2. Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync
  3. Android开发高手课笔记--如何打造高质量应用?
  4. iOS架构-Xcode创建Workspace管理多个子工程(23)
  5. android组件化开发视频教程,教你打造一个Android组件化开发框架
  6. python字典增加和删除_Python字典的基本用法实例分析【创建、增加、获取、修改、删除】...
  7. 获取元素相对于屏幕的位置
  8. js 日历插件开发
  9. 第一讲 网络安全概述笔记
  10. JavaScript的AMD规范