[SCOI2016]萌萌哒
mrclr两周前做的题让蒟蒻的我现在做?
第一眼组合计数,如果把数字相同的数位看作一个整体,除了第一位不能为零,剩下的每一位都有$0$~$9$十种。
设不同的位数为$x$,那么答案即为$9*10$x-1
给出两段相同的区间,可以把它们看作单独的一位一位对应,用并查集把它们合并。
复杂度为$O(n^2)$。
考虑优化。发现修改操作有$n$次,查询只有$1$次。
有效的修改操作最多只有$n-1$次,所以一定有重复的操作。
把复杂度平衡一下。合并区间时,直接将大区间合并,最后将合并标记从大到小下传。
这样,合并的复杂度变小,查询的复杂度变大了。用倍增——也就是二进制拆分的做法,可以让修改、查询的复杂度都变为$O(nlogn)$
$fa[x][i]$表示从$x$开始,长度为$2^i$的区间的父亲(区间),
合并时,将一段区间用二进制拆分成若干个区间并合并;
最后查询时,从最大的区间长度开始枚举,将$[x][i]$的左右两半区间分别与$fa[x][i]$的左右两半区间合并。
void pushdown() {
for(int j = ; j; j--)
for(int i = ; i+(<<j)- <= n; i++) {
int ii = getfa(i,j);
merge(i,ii,j-); //左一半
merge(i + (<<(j-)),ii + (<<(j-)),j-);//右一半
}
}
最后查询并查集个数即可w
代码如下
#include<cstdio>
#include<iostream>
#define MogeKo qwq
#define ll long long
using namespace std;
const int maxn = 1e5+;
const ll mod = 1e9+; int n,m,fa[maxn][];
int l1,l2,r1,r2;
ll cnt; ll qpow(ll a,ll b) {
ll ans = ;
ll base = a;
while(b) {
if(b&) (ans *= base) %= mod;
(base *= base) %= mod;
b >>= ;
}
return ans%mod;
} void init() {
for(int i = ; i <= n; i++)
for(int j = ; j <= ; j++)
fa[i][j] = i;
} int getfa(int x,int k) {
if(fa[x][k] == x)return x;
return fa[x][k] = getfa(fa[x][k],k);
} void merge(int x,int y,int k) {
int xx = getfa(x,k);
int yy = getfa(y,k);
fa[xx][k] = yy;
} void pushdown() {
for(int j = ; j; j--)
for(int i = ; i+(<<j)- <= n; i++) {
int ii = getfa(i,j);
merge(i,ii,j-);
merge(i + (<<(j-)),ii + (<<(j-)),j-);
}
} int main() {
scanf("%d%d",&n,&m);
if(n == ) {
printf("");
return ;
}
init();
for(int i = ; i <= m; i++) {
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
for(int j = ; j >= ; j--)
if(l1+(<<j)- <= r1) {
merge(l1,l2,j);
l1 += (<<j);
l2 += (<<j);
}
}
pushdown();
for(int i = ; i <= n; i++)
if(fa[i][] == i)cnt++;
printf("%lld",(*qpow(,cnt-))%mod);
return ;
}
[SCOI2016]萌萌哒的更多相关文章
- 【BZOJ 4569】 4569: [Scoi2016]萌萌哒 (倍增+并查集)
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 865 Solved: 414 Description 一个长 ...
- 【LG3295】[SCOI2016]萌萌哒
[LG3295][SCOI2016]萌萌哒 题面 洛谷 题解 考虑现在我们如果一次只是限定两个位置相等该怎么做, 直接将这些位置用并查集并起来然后答案就是 \[ ans= \begin{cases} ...
- 4569: [Scoi2016]萌萌哒
4569: [Scoi2016]萌萌哒 链接 分析: 每次给出的两个区间长度是一样的,对应位置的数字也是一样的,那么可以将两两对应的数字用并查集合并,设最后有$cnt$个不同的集合,答案就是$9\ti ...
- 【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集
[BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四 ...
- [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)
[BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...
- Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...
- 洛谷P3295 [SCOI2016]萌萌哒 题解
洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同 ...
- BZOJ4569 : [Scoi2016]萌萌哒
建立ST表,每层维护一个并查集. 每个信息可以拆成两条长度为$2$的幂次的区间相等的信息,等价于ST表里两对点的合并. 然后递归合并,一旦发现已经合并过了就退出. 因为一共只会发生$O(n\log n ...
- bzoj 4569: [Scoi2016]萌萌哒
Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的 ...
- BZOJ 4569: [Scoi2016]萌萌哒 [并查集 倍增]
传送门 题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数 把所有要求相等的位置连起来,不就是$9*10^{连通 ...
随机推荐
- Linux下的C#连接Mysql数据库
今天在尝试在 Linux 系统下使用C#连接数据库,发现网上这方面的信息很少,所以就写一篇博客记录一下. Linux下这里使用的是mono. 首先是缺少Mysql.Data.dll这个库的,所以需要安 ...
- 查看服务器运行多少个ASP.NET Core程序
有时候,我们会想知道某台机器上面跑了什么程序. 当程序部署到IIS上面的时候,我们只需要打开IIS一看,就知道有多少个站点在运行了. 当我们在CentOS上面部署的时候,就没那么的直观了. 当然对于熟 ...
- 开源库支付库Magicodes.Pay发布
Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前支持以下支付方式和功能: 支付宝APP支付 支付 ...
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- Java开发笔记(十)一元运算符的技巧
前面讲到赋值运算符的时候,提到“x = x+7”可以被“x += 7”所取代,当然Java编程中给某个变量自加7并不常见,常见的是给某变量自加1,就像走台阶,一般都是一级一级台阶地走,犯不着一下子跳上 ...
- 数据结构(java版)学习笔记(序章)
程序=数据结构+算法 序章做一个简单的思维导图,方便理解数据结构这门课的大纲,接下来我们将是按照线性表,栈,队列,串,树和图的顺序依次往下学.
- Android Stuido xml使用app属性没有提示代码
解决方法: 打开file->invalidate Caches,之后build->rebuild project 2.重启Android Studio
- springboot、springsecurity、jwt权限验证
1.背景 基于前后端分离项目的后端模块: 2.相关技术 springboot全家桶 web模块 security模块:用于权限的验证 mongodb 模块:集成mogodb模块 jwt 用于token ...
- java三大版本和核心优势
javaSE(java standard Edition):标准版,定位在个人计算机上的应用. javaEE(java Enterprise Edition):企业版,定位在服务器端的应用.***** ...