P3295 [SCOI2016]萌萌哒(DP+倍增)
P3295 [SCOI2016]萌萌哒
description
solution
强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的
只需要考虑那一个数据结构将其转化成O(nlogn)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+倍增)相关推荐
- 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)
传送门 思路太妙了啊-- 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...
- p3295 [SCOI2016]萌萌哒
传送门 分析 我们可以将一个点拆成logN个点,分别代表从点i开始,长度为2^k的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成log个区间,分别并起来即可 当然我们这样做修改是省 ...
- 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 ...
- BZOJ4569: [Scoi2016]萌萌哒
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 961 Solved: 464 [Submit][Statu ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...
- 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 ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Submit: 2131 Solved: 865 [Submit][Sta ...
- 【香蕉oi】耍望节(数位DP+倍增优化)
文章目录 题意 思路 注意 代码 题意 有一个长度为n(n≤5∗104)n(n\le 5*10^4)n(n≤5∗104)的只包含数字和?的字符串sss,?中可以填上任意数字.一种合法的填数方案必须满足 ...
最新文章
- [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
- vector 对某个下标排序_Python实现堆排序
- 扩展方法IEnumerableT转换为IListSelectListItem ,提供@Html.DropDownList使用
- 汉寿县智慧城市建设PPP项目成功签约
- 7 php 内存泄漏_PHP 内存泄漏分析定位
- AUTOCAD二次开发VBA 基础到实例视频教程
- C语言项目源代码大全2021最新!
- matlab 没有vartestn,2013五一赛数学建模论文.docx
- 阵列win不识别linux识别,解决Raid模式下重装系统无法识别固态硬盘的问题
- ADNI介绍与数据下载
- Jumper蹦跶的人:一段天马行空的梦想
- android 小屏模式吗,宅在家又嫌手机屏幕小?教你如何玩转投屏
- 达人评测 华为MatePad2和华为MatePad2 Pro 怎么样
- 大疆社招测开面经(一年经验,已通过)
- OvR逻辑回归多分类算法
- Unity使用Isometric Z As Y Tilemap创建2.5D地图(二)如何按照正确遮挡顺序渲染图片
- Python爆破校园饮水机系统,喝水还要花钱?不存在的,免费饮水!
- 发育中的小鼠大脑细胞与结构图谱
- ActionForm与bean的区别
- 找回sonarqube管理员密码
热门文章
- 【汇总推荐】深度学习、自然语言处理干货笔记汇总
- 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!
- android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法
- ios把数据传递到另一个页面_iOS 委托 页面之间传递数值
- 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形
- ios中amplify配置configure_Nginx源码编译安装及配置文件初步学习
- linux脚本传参修改配置文件,shell脚本修改配置文件指定行的值
- leetcode——344. 反转字符串
- 10-4 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格 (10 分)思路+详解+测试用例
- [MyBatisPlus]模拟多数据源环境及测试