bzoj 4569: [Scoi2016]萌萌哒

4569: [Scoi2016]萌萌哒

Description

一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条

件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+1Sl2+2...S

r2完全相同。比如n=6时,某限制条件l1=1,r1=3,l2=4,r2=6,那么123123,351351均满足条件,但是12012,13

1141不满足条件,前者数的长度不为6,后者第二位与第五位不同。问满足以上所有条件的数有多少个。

Input

第一行两个数n和m,分别表示大数的长度,以及限制条件的个数。接下来m行,对于第i行,有4个数li1,ri1,li2

,ri2,分别表示该限制条件对应的两个区间。

1≤n≤10^5,1≤m≤10^5,1≤li1,ri1,li2,ri2≤n;并且保证ri1-li1=ri2-li2。

Output

一个数,表示满足所有条件且长度为n的大数的个数,答案可能很大,因此输出答案模10^9+7的结果即可。

Sample Input

4 2
1 2 3 4
3 3 3 3

Sample Output

90

题解:

很巧妙的一道题。

不考虑模,发现答案的情况只能是9,90,900这些,因为可以把所有数位中互不干扰的找出来,乘一乘就好了。

那么我们就需要维护单个数位的父亲,朴素的做法是按操作一个一个合并,但是发现可以用类似倍增的思想,像st表一样维护一个区间的父亲。

#include<stdio.h>
#include<iostream>
using namespace std;
const int N=100005;
const int M=1e9+7;
int n,m,i,j,l,r,x,y,ans,f[N][17];bool p[N];
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
int get(int x,int y)
{
	if(f[x][y]==x) return x;else return f[x][y]=get(f[x][y],y);
}
int log(int x)
{
	int k=0;
	while(x>1) k++,x>>=1;return k;
}
void solve(int l,int r,int p)
{
	if(get(l,p)==get(r,p)) return;
	f[f[l][p]][p]=f[r][p];
	if(!p) return;
	p--;
	solve(l,r,p);solve(l+(1<<p),r+(1<<p),p);
}
int main()
{
	read(n),read(m);
	for(j=0;(1<<j)<=n;j++)
	 for(i=1;i+(1<<j)-1<=n;i++) f[i][j]=i;
	for(i=1;i<=m;i++)
	{
		read(x),read(y),read(l),read(r);
		int p=log(y-x+1);
		solve(x,l,p);solve(y-(1<<p)+1,r-(1<<p)+1,p);
	}
	ans=9;
	p[get(1,0)]=1;
	for(i=2;i<=n;i++) if(!p[get(i,0)]) p[get(i,0)]=1,ans=10LL*ans%M;
	cout<<ans;
	return 0;
}

  

  

时间: 2025-01-01 11:38:54

bzoj 4569: [Scoi2016]萌萌哒的相关文章

BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集

好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个部分是否合并,如果合并就不向下递归. 然后可以剪去许多状态,变成了$O(nlogn)$的. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using n

4569: [Scoi2016]萌萌哒

4569: [Scoi2016]萌萌哒 链接 分析: 每次给出的两个区间长度是一样的,对应位置的数字也是一样的,那么可以将两两对应的数字用并查集合并,设最后有$cnt$个不同的集合,答案就是$9\times 10 ^{cnt-1}$,第一个数不能是0. 暴力合并太慢了,考虑优化.对于一段区间,用倍增的思想分成log段,分别合并log段,最后的下放一下标记即可.类似线段树的懒标记. 代码: #include<cstdio> #include<algorithm> #include&l

【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集

[BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+1Sl2+2...Sr2完全相同.比如n=6时,某限制条件l1=1,r1=3,l2=4,r2=6,那么123123,351351均满足条件,但是12012,131141不满足条件,前者数

Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)

P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, \(S_1\) 是数的最高位.告诉你一些限制条件,每个条件表示为四个数, \(l_1,r_1,l_2,r_2\) ,即两个长度相同的区间,表示子串 \(S_{l_1}S_{l_1+1}S_{l_1+2} \cdots S_{r_1}\) 与 \(S_{l_2}S_{l_2+1}S_{l_2+2} \

SCOI2016萌萌哒题解

SCOI2016萌萌哒题解 题目链接 思路 这个题目大概就是给你一些限制,使区间相等,那么一个很巧妙的思路就是将区间限制转化为两个店在一个并查集里 我们要求的是只有一位的并查集的个数,答案为 ( t我们要求的是只有一位的并查集的个数) 但直接操作复杂度过大 于是有人想到了倍增 f[i][j]表示区间[ , ]所在的并查集 最开始时记录每个大区间的左右儿子 输入 l1 l2 r1 r2时像ST表一样合并 再分别处理每个大区间,如果f[i][j]和f[a][b]在一个并查集里,那么他们的左右儿子也在

[SCOI2016]萌萌哒 解题报告

[SCOI2016]萌萌哒 题意 有一个长度为 \(n\) 的大数, 有 \(m\) 个形如 l1,r1,l2,r2的限制, 表示区间 \([l1,r1]\) 和 \([l2,r2]\) 完全相等, 求满足这些限制的数的个数, 不能含有前导零. \((1 \le n,m \le 10^5)\) 思路 暴力 : 直接 \(O(nm)\) 把相等的数合成一个并查集, 最后若并查集的数量为 \(k\), 则答案为 \(9 \times 10^{k-1}\). (不能有前导零). 考虑优化. 首先想到线

BZOJ 4569 萌萌哒

SCOI血泪史.... ST+并查集. 昏昏沉沉的情况下交了过去然而垫底..6000ms. 反正还是没TLE嘛. 唉. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 200500 #define mod 1000000007 using namespace std; long long n,m,l1,l2,r1,r2,anc[max

bzoj 4568: [Scoi2016]幸运数字

4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 848  Solved: 336[Submit][Status][Discuss] Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A 国.旅行者计划 乘飞机降落在 x 号城市,沿着 x 号

[BZOJ 4571][Scoi2016]美味(主席树)

Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或 运算.第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 li 道到第 ri 道中选择.请你帮助他们找出最美味的菜. Solution 按位贪心,每次通过查询一段区间是