bzoj 4569: [Scoi2016]萌萌哒
Description
Input
Output
一个数,表示满足所有条件且长度为n的大数的个数,答案可能很大,因此输出答案模10^9+7的结果即可。
Sample Input
1 2 3 4
3 3 3 3
Sample Output
HINT
Source
陈老师讲的一个题,思路还是很妙的。。。
考虑这个题最后要求的就是有多少种等价类,我们考虑用并查集来实现。。。
如果暴力做的话,给定[l1,r1],[l2,r2],就把这两个区间中对应的位置用并查集并起来。。。
正解的话是ST表的鬼畜应用。。。每个ST[i][j]都代表一个点。。。。
对[l1,r1],[l2,r2],按ST表的那套理论,都拆为两个2^x的区间,然后把对应的区间的点用并查集并起来。。。
然后我们考虑把i从高层往低层下传额外关系,即从2^k -> 2^(k-1),
因为ST[k][j] 可以拆为两个ST[k-1][...]。。。
如果在2^k层,ST[k][i]与ST[k][j]在同一集合,那么在2^(k-1),ST[k-1][i]和ST[k-1][j]在同一集合中,另外一个同理。。。
最后统计,2^0 层有多少个集合就行了。。。
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int N=200050;
const int Mod=1e9+7;
int pre[N],pre2[N],ST[20][N],n,m,tt,fa[N*20],tong[N],ans;
struct date{
int x,y;
}g[N*20],la[N*20];
void make_ST(){
pre[0]=1;for(int i=1;i<=18;i++) pre[i]=pre[i-1]<<1;
pre2[0]=-1;for(int i=1;i<=n;i++) pre2[i]=pre2[i>>1]+1;
for(int i=1;i<=n;i++) ST[0][i]=++tt;
for(int i=1;i<=18;i++)
for(int j=1;j<=n;j++){
if(j+pre[i]-1<=n){
ST[i][j]=++tt,g[tt].x=ST[i-1][j],g[tt].y=ST[i-1][j+pre[i-1]];
}
}
for(int i=1;i<=tt;i++) fa[i]=i;
}
int find(int x) {
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
struct data{
int u,v;
};
data query(int l,int r){
int x=pre2[r-l+1];
int u=find(ST[x][l]),v=find(ST[x][r-pre[x]+1]);
return (data){u,v};
}
int main(){
scanf("%d%d",&n,&m);make_ST();
for(int i=1;i<=m;i++){
int l1,r1,l2,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
data x=query(l1,r1),y=query(l2,r2);
if(x.u!=y.u) fa[x.u]=y.u;
if(x.v!=y.v) fa[x.v]=y.v;
}
for(int i=18;i;i--){
for(int j=1;j<=n;j++){
int x=ST[i][j],y=find(x);
if(!la[y].x){
la[y].x=g[x].x,la[y].y=g[x].y;
}
else{
int u=find(la[y].x),v=find(g[x].x);
if(u!=v) fa[u]=v;
int u1=find(la[y].y),v1=find(g[x].y);
if(u1!=v1) fa[u1]=v1;
la[y].x=g[x].x,la[y].y=g[x].y;
}
}
}
ll ans=1;
for(int i=1;i<=n;i++){
if(!tong[find(ST[0][i])]){
tong[find(ST[0][i])]++;
if(i==1) (ans*=9)%=Mod;
else (ans*=10)%=Mod;
}
}
printf("%lld\n",ans);
return 0;
}
bzoj 4569: [Scoi2016]萌萌哒的更多相关文章
- BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...
- BZOJ 4569: [Scoi2016]萌萌哒 [并查集 倍增]
传送门 题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数 把所有要求相等的位置连起来,不就是$9*10^{连通 ...
- bzoj 4569 [Scoi2016]萌萌哒 并查集 + ST表
题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每 ...
- BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集
好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...
- 【BZOJ 4569】 4569: [Scoi2016]萌萌哒 (倍增+并查集)
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 865 Solved: 414 Description 一个长 ...
- 4569: [Scoi2016]萌萌哒
4569: [Scoi2016]萌萌哒 链接 分析: 每次给出的两个区间长度是一样的,对应位置的数字也是一样的,那么可以将两两对应的数字用并查集合并,设最后有$cnt$个不同的集合,答案就是$9\ti ...
- BZOJ 4569 萌萌哒
题目传送门 4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 483 Solved: 221 [Submit][S ...
- 【LG3295】[SCOI2016]萌萌哒
[LG3295][SCOI2016]萌萌哒 题面 洛谷 题解 考虑现在我们如果一次只是限定两个位置相等该怎么做, 直接将这些位置用并查集并起来然后答案就是 \[ ans= \begin{cases} ...
- 【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集
[BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四 ...
随机推荐
- (转载) Java子类与父类之间的对象转换
在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...
- 题目1083:特殊乘法-九度oj
题目描述: 写个算法,对2个小于1000000000的输入,求结果. 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5 输入: 两个小于1000000000的 ...
- SaltStack 部署案例 02
远程执行 salt '*' state.sls apache '*':代表所有主机 state.sls :是一个模块 apache : 状态 ,表示需要部署的内容,后缀.sls YAML:三板斧 1. ...
- apache编译安装 httpd 2.2 httpd 2.4
#apache编译安装#httpd 2.2 , httpd 2.4 #!/bin/sh #apache编译安装 #httpd 2.2 , httpd 2.4 #centos #rpm -e httpd ...
- JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)
通过构造函数生成的实例化对象,无法共享属性或方法(即每个实例化对象上都有构造函数中的属性和方法):造成了一定的资源浪费 function Obj(name,age){ this.name=name; ...
- 微信原始demo
有可能下载最新的demo下载不到这个原版的精简demo了. 这里为大家提供一下.以下代码为原始未改动代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 ...
- git操作之上传gitthub
push 失败解决方法: 分支操作: 分支操作之覆盖: 主master操作:
- XAMPP重要文件目录及配置
一.XAMPP 的安装过程 1:下载XAMPP 的 Linux 版 (1.7.4) http://www.apachefriends.org/en/xampp-linux.html#374 2:安装( ...
- 你不得不了解的应用容器引擎---Docker
最近突然想搭一个redis集群玩玩,因为公司的电脑同时开2个虚拟机就卡的不行,所以我就想到用Docker开启多个redis-server来搭建.然后在网上找着找着发现,使用Docker,哪需要搭建啊, ...
- PHP 使用Echarts生成数据统计报表
echarts统计,心血来潮~~ 先看下效果图 看下代码 HTML页面 为ECharts准备一个Dom,宽高自定义 <div class="panel panel-info" ...