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是数的最高位,告诉你一些限制条件,每个条件表示为四 ...
随机推荐
- 【MAVEN】maven系列--pom.xml标签详解
pom文件作为MAVEN中重要的配置文件,对于它的配置是相当重要.文件中包含了开发者需遵循的规则.缺陷管理系统.组织.licenses.项目信息.项目依赖性等.下面将重点介绍一下该文件的基本组成与功能 ...
- 75、django之ORM补充
本篇导航: QuerySet 中介模型 查询优化 一.QuerySet 1.可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. > ...
- VSCode 同步设置及扩展插件 实现设备上设置统一
准备工作:电脑上需安装VSCode,拥有一个github账户.实现同步的功能主要依赖于VSCode插件 "Settings Sync" Setting Sync 可同步包含的所有扩 ...
- Windos系统git提交
一.$ git status //查看当前项目下所有文的状态,如果第一次,你会发现都红颜色的,因为它还没有交给git/github管理. 二.$ git add . //(.)点表示当前目录下 ...
- Scala入门系列(五):面向对象之类
定义类 // 定义类,包含field以及method class HelloWorld { private var name = "Leo" def sayHello() { pr ...
- Java开发小技巧(一)
前言 相信许多程序员在看别人写的代码的时候,会有怀疑人生的感想,面对一堆天书一样的代码,很难摸清作者的思路,最后选择了重构,如果你认同上面这个作法,说明了两个问题:要么原来的开发者技术菜.要么你技术菜 ...
- FiddlerCoreAPI开发(一)源码分析
1.前言 前一段时间想利用fiddlercore截取本地HTTPS的流量做一些分析,按照样例代码的注释学习了一下,没搞清楚怎么实现,后来又在网上查了些资料,对HTTPS的处理提及很少,都没有解决我的问 ...
- 利用qq设置个性化的域名邮箱
首先有域名.先去注冊先,国内有非常多域名交易平台.我是在易名中国网上注冊的一个域名,Lios.top,因为这个域名价值非常低.一年才 10元,价格非常实惠. 下一步就是去qq邮箱的设置里,找到账户,然 ...
- UVA 12009 - Avaricious Maryanna(数论)
UVA 12009 - Avaricious Maryanna 题目链接 题意:给定一个n.求出n个数位组成的数字x,x^2的前面|x|位为x 思路:自己先暴力打了前几组数据,发现除了1中有0和1以外 ...
- CvIntHaarClassifier
//定义一个宏.宏里面是指针函数 #define CV_INT_HAAR_CLASSIFIER_FIELDS() \ float (*eval)( CvIntHaarClassifier*, sum_ ...