BZOJ 4569 萌萌哒】的更多相关文章

题目传送门 4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 483 Solved: 221 [Submit][Status][Discuss] Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+…
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log n\)层一样,我们开\(\log n\)个并查集.当已知\([l_1, r_1]\)和\([l_2, r_2]\)相同的时候,设\(j = \lfloor \log (r_1 - l_1 + 1) \rfloor\),把\(l_1, l_2\)在\(j\)这层的并查集中合并,把\(r_1 - 2^j…
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 865  Solved: 414 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+1Sl2+2...S r2完全相同.比如n=6时,某限制条件l…
http://www.lydsy.com/JudgeOnline/problem.php?id=4569 用ST表表示所有区间,根据ST表中表示的区间长度种一棵nlogn的树,类似线段树,每个节点的左孩子和右孩子表示的区间拼接起来的总区间即为这个节点表示的区间.树上同一层节点表示的区间长度相同,同一层节点就可以用并查集来维护. 这样对于m个限制,用ST表把每个限制中的区间拆成前一块和后一块两块,限制中要求相同的两个区间的前一块和后一块分别用并查集合并,可以满足这两个区间完全相同. 最后从树的顶部…
题目链接:萌萌哒 我先不吐槽题目名……这道题的并查集好像我们考过……既然那道题我没写就来把这道题写了吧(雾 这道题由于合并操作只有\(m\)次,那么很显然的一个想法就是把建一棵线段树类似物,然后每次在上面分裂区间.但是由于只有区间长度相同的才能用并查集直接维护,所以时间复杂度是\(O(m \log ^2n)\).注意这里和下文都没有考虑并查集复杂度. 这样做的话我们把原序列用\(O(n)\)个区间表示了,但是每次操作是\(O(\log^2 n)\)的.如果我们找出了更多的区间,也许就可以把单词操…
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,后者第二位与第五位不同.问满…
传送门 题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数 把所有要求相等的位置连起来,不就是$9*10^{连通块个数}$嘛 但是最坏情况要连$nm$次啊 有很多都是重复的太浪费了 于是各种乱搞,甚至想了一下分块,即使能减少边的条数也不能减少计算时会走的边的次数 然后看题解,竟然是用倍增来优化 有道理啊,分块太死板了,倍增的话就可以灵活的得到每个区间 $fa[i][j]$表示从i开始$2^j$个数的区间的父亲…
题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条件表示为四个数,\(l_1,r_1,l_2,r_2\),即两个长度相同的区间,表示子串\(S_{l1}S_{l1+1}S_{l1+2}...S_{r1}\)与\(S_{l2}S_{l2+1}S_{l2+2}...S_{r2}\)完全相同. 问满足以上所有条件的数有多少个. 思路 参考 https…
好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个部分是否合并,如果合并就不向下递归. 然后可以剪去许多状态,变成了$O(nlogn)$的. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using n…
4569: [Scoi2016]萌萌哒 链接 分析: 每次给出的两个区间长度是一样的,对应位置的数字也是一样的,那么可以将两两对应的数字用并查集合并,设最后有$cnt$个不同的集合,答案就是$9\times 10 ^{cnt-1}$,第一个数不能是0. 暴力合并太慢了,考虑优化.对于一段区间,用倍增的思想分成log段,分别合并log段,最后的下放一下标记即可.类似线段树的懒标记. 代码: #include<cstdio> #include<algorithm> #include&l…