[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^{连通 ...
随机推荐
- LeetCode专题-Python实现之第13题:Roman to Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- 我和Session的不解之“缘”(故事型技术长文)
本文讲述了一路走来对Session的认知.文章有点长,不过是故事型的,应该不枯燥.相信读完也一定会有所收获. (一) “当你登陆系统后,服务器会创建一个Session,保存你的登陆信息,下次再访问时就 ...
- tcp没用吗?为什么MOBA、“吃鸡”游戏不推荐用tcp协议
本文由云+社区发表 作者:腾讯云游戏行业资深架构师 余国良 MOBA类和"吃鸡"游戏为什么对网络延迟要求高? 我们知道,不同类型的游戏因为玩法.竞技程度不一样,采用的同步算法不一样 ...
- 权限管理系统之项目框架搭建并集成日志、mybatis和分页
前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据. 一.项目框架 首先要解决的是项目框架问题,搭建什么样的 ...
- Linux基础命令第三天
1,vim编辑器 命令模式下: pageup 往上翻页 pagedown 往下翻页 H 光标移动到屏幕首行 gg 光标动荡到文档的首行,如果前面加上n,表示移动到n行 G 移动文档最后一行 /name ...
- Aooms_微服务基础开发平台实战_001_开篇
一.引子 “ 微服务”近年来很火的一个词,如今的热度不亚于当年的SSH组合,各种开发框架.中间件.容器.概念层出不穷. 比如:dubbo.motan.zookeeper.springboot.spri ...
- 第51章 内省端点(Introspection Endpoint) - Identity Server 4 中文文档(v1.0.0)
内省端点是RFC 7662的实现. 它可用于验证引用令牌(如果消费者不支持适当的JWT或加密库,则可以使用JWT).内省端点需要身份验证 - 因为内省端点的客户端是API,您可以在其上配置秘密ApiR ...
- [转]GitLab-CI与GitLab-Runner
本文转自:https://www.jianshu.com/p/2b43151fb92e 一.持续集成(Continuous Integration) 要了解GitLab-CI与GitLab Runne ...
- [angularjs] AngularJs 知识回顾
AngularJs 知识回顾 简介 1.通过指令扩展了 HTML,通过表达式绑定数据到 HTML: 2.一个 Js 框架: 3.指令: 通过被称为 指令 的新属性来扩展 HTML, 即为应用添加新功能 ...
- JQuery官方学习资料(译):Utility方法
JQuery提供了一些utility方法在$命名空间里,这些方法对完成常规的编程任务非常有帮助. $.trim() 删除前后部的空白内容. // 返回 "lots of ex ...