P3295 [SCOI2016]萌萌哒

description

solution

强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的
只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的

树之类的就不考虑了,一段一段的区间——倍增啊!
将点iii拆成logloglog个点
fi,j:f_{i,j}:fi,j​: 仅考虑[i,i+2j)[i,i+2^j)[i,i+2j)段内的数
最后进行fff并查集的标记下放合并
最后则是9∗10cnt−1,cnt9*10^{cnt-1},cnt9∗10cnt−1,cnt表示不同的并查集数量,首不能为000

code

#include <cstdio>
#define mod 1000000007
#define int long long
#define maxn 100005
int n, m, cnt;
int f[maxn][20];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void make() {for( int i = 1;i <= n;i ++ )for( int j = 0;j < 20;j ++ )f[i][j] = i;
}int find( int i, int j ) {return i == f[i][j] ? i : f[i][j] = find( f[i][j], j );
}void merge( int i, int k, int j ) {if( find( i, j ) == find( k, j ) ) return;else f[f[i][j]][j] = f[k][j];
}signed main() {scanf( "%lld %lld", &n, &m );make();for( int i = 1, l, r, L, R;i <= m;i ++ ) {scanf( "%lld %lld %lld %lld", &l, &r, &L, &R );for( int j = 19;~ j;j -- )if( l + ( 1 << j ) - 1 <= r ) {merge( l, L, j );//给一整段都打上标记l += ( 1 << j );L += ( 1 << j );}}for( int j = 19;j;j -- )for( int i = 1;i + ( 1 << j ) - 1 <= n;i ++ ) {//标记下放merge( i, find( i, j ), j - 1 );merge( i + ( 1 << j - 1 ), f[i][j] + ( 1 << j - 1 ), j - 1 );}int tot = 0;for( int i = 1;i <= n;i ++ )if( find( i, 0 ) == i ) tot ++;printf( "%lld\n", qkpow( 10, tot - 1 ) * 9 % mod );return 0;
}

P3295 [SCOI2016]萌萌哒(DP+倍增)相关推荐

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

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

  2. p3295 [SCOI2016]萌萌哒

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

  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. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  6. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】

    题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...

  7. 2019长沙学院新生赛(A水,B水,C(整除分块),D水,E(巧数学),F(二分+bfs),H(换根dp),I(线段树)J(dp+倍增+lca))

    A-XOR SUM 通过简单观察得知连续四个数的异或值就是等于0,暴力找出左区间和右区间就可以了,最多跑四个单位 0^1^2^3==0   4^5^6^7=0 #include<bits/std ...

  8. [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 2131  Solved: 865 [Submit][Sta ...

  9. 【香蕉oi】耍望节(数位DP+倍增优化)

    文章目录 题意 思路 注意 代码 题意 有一个长度为n(n≤5∗104)n(n\le 5*10^4)n(n≤5∗104)的只包含数字和?的字符串sss,?中可以填上任意数字.一种合法的填数方案必须满足 ...

最新文章

  1. [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
  2. vector 对某个下标排序_Python实现堆排序
  3. 扩展方法IEnumerableT转换为IListSelectListItem ,提供@Html.DropDownList使用
  4. 汉寿县智慧城市建设PPP项目成功签约
  5. 7 php 内存泄漏_PHP 内存泄漏分析定位
  6. AUTOCAD二次开发VBA 基础到实例视频教程
  7. C语言项目源代码大全2021最新!
  8. matlab 没有vartestn,2013五一赛数学建模论文.docx
  9. 阵列win不识别linux识别,解决Raid模式下重装系统无法识别固态硬盘的问题
  10. ADNI介绍与数据下载
  11. Jumper蹦跶的人:一段天马行空的梦想
  12. android 小屏模式吗,宅在家又嫌手机屏幕小?教你如何玩转投屏
  13. 达人评测 华为MatePad2和华为MatePad2 Pro 怎么样
  14. 大疆社招测开面经(一年经验,已通过)
  15. OvR逻辑回归多分类算法
  16. Unity使用Isometric Z As Y Tilemap创建2.5D地图(二)如何按照正确遮挡顺序渲染图片
  17. Python爆破校园饮水机系统,喝水还要花钱?不存在的,免费饮水!
  18. 发育中的小鼠大脑细胞与结构图谱
  19. ActionForm与bean的区别
  20. 找回sonarqube管理员密码

热门文章

  1. 【汇总推荐】深度学习、自然语言处理干货笔记汇总
  2. 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!
  3. android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法
  4. ios把数据传递到另一个页面_iOS 委托 页面之间传递数值
  5. 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形
  6. ios中amplify配置configure_Nginx源码编译安装及配置文件初步学习
  7. linux脚本传参修改配置文件,shell脚本修改配置文件指定行的值
  8. leetcode——344. 反转字符串
  9. 10-4 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格 (10 分)思路+详解+测试用例
  10. [MyBatisPlus]模拟多数据源环境及测试