P3295-[SCOI2016]萌萌哒【ST表,并查集】
正题
题目链接:https://www.luogu.com.cn/problem/P3295
题目大意
一个nnn位的数字,mmm个条件给出两个完全相同的区间,求可能的数字数量。
解题思路
其实就是区间中的每个数字分别连边,但是这样显然会TTT。考虑通过消耗查询的复杂度来平衡询问的复杂度。
考虑用STSTST表进行优化,我们定义fi,jf_{i,j}fi,j的点表示位置[i,i+2j−1][i,i+2^j-1][i,i+2j−1]这个区间,显然只有jjj相同的可以进行连边。
连边完成之后我们按照区间长度从大到小的拆分,对于每个点,我们让它的两个下层节点与它父节点的两个下层节点分开连边就好了。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10,XJQ=1e9+7;
int n,m,cnt,f[N][20],p[N*20],fa[N*20],lg;
int find(int x)
{return fa[x]==x?(x):(fa[x]=find(fa[x]));}
void unionn(int x,int y){x=find(x);y=find(y);if(x==y)return;if(x<y)fa[y]=x;else fa[x]=y;return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=0;i+(1<<j)-1<=n;j++)f[i][j]=++cnt,p[cnt]=i,lg=max(lg,j),fa[cnt]=cnt;while(m--){int l1,r1,l2,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);int len=r1-l1+1;for(int i=0;(1<<i)<=len;i++)if((len>>i)&1)unionn(f[l1][i],f[l2][i]),l1+=(1<<i),l2+=(1<<i);}for(int j=lg;j>=1;j--)for(int i=1;i+(1<<j)-1<=n;i++){int x=f[i][j],y=find(x);if(x==y)continue;int ii=p[y];unionn(f[i][j-1],f[ii][j-1]);unionn(f[i+(1<<j-1)][j-1],f[ii+(1<<j-1)][j-1]);}int ans=1;bool flag=1;for(int i=1;i<=n;i++)if(p[find(f[i][0])]==i){if(flag)ans=9,flag=0;else ans=1ll*ans*10%XJQ;}printf("%d\n",ans);
}
P3295-[SCOI2016]萌萌哒【ST表,并查集】相关推荐
- 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)
传送门 思路太妙了啊-- 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...
- 【BZOJ4569】萌萌哒,ST表+并查集
Time:2016.08.03 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: sunshine爷模拟题之一 自认计数类问题还可以的我找了半天规律也只会50分做法: 对于每个询问直接 ...
- P3295 [SCOI2016]萌萌哒(DP+倍增)
P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结 ...
- 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 ...
- p3295 [SCOI2016]萌萌哒
传送门 分析 我们可以将一个点拆成logN个点,分别代表从点i开始,长度为2^k的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成log个区间,分别并起来即可 当然我们这样做修改是省 ...
- 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)
题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...
- BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
题目链接:http://uoj.ac/problem/274 题意概述: 没什么好概述的......概述了题意就知道怎么做了......我懒嘛 分析: 就是用lct维护最大生成树. 然后如果去UOJ上 ...
- bzoj4569 [Scoi2016]萌萌哒 并查集+st表
这个题非常巧妙,它描述了一种新的延迟标记关系.. 正常的线段树是用n*4的空间描述一个序列,所以对于一段区间,有可能会有log个点对应一个点 而线段树是利用尽量小的空间使查询变为log st表是nlo ...
- NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...
最新文章
- 图解|什么是缺页错误Page Fault
- numpy 数组抽取_Python 关于NumPy的用法介绍
- js_组合继承(最常用的继承方式)
- html5健康有机蔬菜果汁店网站模板
- 计算机网络分层作业,计算机网络作业布置-参考答案
- Go语言---结构体
- jsp 运用 session 登录输出
- maven依赖冲突以及解决方法
- python抓取直播源 并更新_如何抓取和转换播放电视直播源m3u8?
- 如何用matlab画圆
- 开发分布式WebIm--1(设想)
- android手机存储空间猛增,实测安卓升级到鸿蒙,可用内存增加半个G,存储空间增加6个G...
- java怎么定位error_程序遇到错误定位一些小技巧
- Oracle 的 表空间(Tablespace)、用户(User)、模式(Schema)
- 黑龙江大米:正宗东北大米,源于黑土地
- 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Noisy relationships
- 为什么你看书记不住,记住不会用?-我的技术学习方法论
- QT注册登录以及安装问题
- 向Android模拟器中批量导入通讯录联系人
- Qt(C++)项目中使用 Basler 工业相机(2 参数设置)
热门文章
- 这次牛逼了,面试字节被问LinkedList原理了!手足无措啊
- oracle+11g+rda,Oracle RDA 4.20 初体验
- Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取
- ubuntu14安装python_ubuntu14.04 安装python3.7
- JAVA设置新视口,java – 在更大的图像上移动视口; JLablel JScrollPane
- mysql怎么访问用户B_MySQL访问控制和用户管理
- java先进先出 循环队列,JavaScript队列、优先队列与循环队列
- python能做哪些客户端_Python 实现简单的客户端认证
- Linux系统语言教程,Linux操作系统基础及语言基础教程-麦可网张凌华
- leetcode347. 前 K 个高频元素