数据结构 & hash
文章平均质量分 58
SuPhoebe
不是我针对谁,我是说在座的诸位都比我强
展开
-
布隆过滤器:集合去重
简介布隆过滤器(Bloom Filter)实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。原理当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在集合中(获得在这个集合中的概率)。Fa...原创 2019-03-31 08:01:19 · 1636 阅读 · 0 评论 -
Andrew Stankevich Contest 28 - F
Problem F. Move to FrontInput file: mtf.in Output file: mtf.out Time limit: 1 second Memory limit: 256 megabytesMove-to-Front is a method of transforming sequences of positive integer numbers, that原创 2015-07-12 14:35:53 · 775 阅读 · 0 评论 -
Testing Round #12
A. Divisibility 直接分类讨论#include<bits/stdc++.h>using namespace std;int main(){ long long a,b,c; cin>>c>>a>>b; long long ans = 0; if(a<=0 && b<=0) { swap(a,b); a=-a,b原创 2015-11-14 17:14:29 · 600 阅读 · 0 评论 -
HDU 5238 Calculator【线段树】
其实这题真是不好想啊 首先,我们观察到29393不是一个质数,通过质分解我们得到29393=7∗13∗17∗1929393=7*13*17*19于是就可以想到中国剩余定理,将数给分解了再求模方程。那么就可以将所有的数对这四个数取模。 剩下就是如何维护修改了。注意到,最多就只有20个数,所以我们可以用一个长度为二十的数组记录,每个数加上某段变化之后可以得到什么。那么就用线段树区间查询,通过[L,R原创 2015-09-22 20:26:06 · 642 阅读 · 2 评论 -
HDU 5454 Excited Database【线段树】
简单线段树,就是推公式的过程有点不是特别熟练。 按照叉姐的方法,可以用三个树状数组维护,三种情况。 按照坦克工程师的方法,用容斥,将一个矩形分解成三个三角形,一个大的直角三角形减去两个小的直角三角形,一种情况,复杂度O(n(logn)2)O(n(logn)^2)。 我的写法无非就是将叉姐的方法换成两个线段树。我们先将对角线缩成一个点,所以总共有2n2n条主对角线,2n2n条负对角线,所以是4n原创 2015-09-21 18:08:47 · 1071 阅读 · 0 评论 -
UESTC 87 Easy Problem With Numbers
DescriptionGive a sequence of integers, you are required to deal with the following operations.For each integer in the interval , change its value to previous value multiplying or dividing an integer原创 2015-10-07 19:28:51 · 677 阅读 · 0 评论 -
UVAlive 4763 Sudoku Extension【DLX】
DLX裸题 注意下标,这里的下标有些扭曲….// whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <climits>#in原创 2015-10-06 19:19:14 · 523 阅读 · 0 评论 -
Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】
因为 sis_i为近似周期序列,而且告诉你了mm个位置以及数字。 那么就将序列分成mm段,每一段用一个ST表来维护区间矩阵乘积 然后注意一些细节,比如mm段分段如果两个不周期位置连续,以及最后一个段等等。想法还是比价明显的,但是确实不好写….#include<bits/stdc++.h>using namespace std;const int MAXN=50005;int MOD;st原创 2015-09-07 08:19:20 · 696 阅读 · 0 评论 -
HDU 5361 In Touch
首先的想法是线段树,因为是区间更新的,所以就是一边dij一边query和update。 今天想了一想,觉得似乎不要用这么麻烦的方法。 下面证明通过某种排序方式使得每个点只要被更新过了,就必定是最近距离。因此我们可以将更新过的点压缩掉。 每个点连出去的边权是相同的,那么我们只需要按照dis[u]+cost[u]dis[u]+cost[u]从小到大排序就可以保证接下来更新的点距离一定是最小,因为原创 2015-08-07 14:04:10 · 1007 阅读 · 0 评论 -
GYM 100685 G【并查集】
一开始看题就水了一发bitset,本地是没有什么问题,但是交上去果断地MLE了。那么就想到乱搞,假设将其变成一颗有根树,如果dfs的时候走的是正的边,就在正的并查集里面merge,如果走的是负的边,就在反的并查集里面merge。对于一个查询,查询一下他们的LCA,如果他们的LCA,在u(或者v)正的并查集中,在另一个反的并查集内,那么就是可以访问,否则不行。大家可以脑补一下图像,必然是这样的。#in原创 2015-09-01 16:53:16 · 558 阅读 · 0 评论 -
HDU 5409 CRB and Graph【dfs序+RMQ】
先用trajan缩环变成了一棵树 然后删除了一条边就将树分成了两个部分,一个是删除的那边下面的子树,一个是剩余部分。那么要查询的是两个部分中最大的点的值,和不大于它的最小的点的值。这样一想就有点像树链剖分啊,树形DP一样求出一颗子树的某个最大值。 又想到是分离出一颗子树,那么就是想到一些dfs序可以对子树进行区间求值。那么就想到可以预处理出dfs序列,将树的值转化为一个区间值。去掉一颗子树,就是将原创 2015-08-31 22:17:12 · 681 阅读 · 0 评论 -
划分树
划分树,从网上看到的代码的风格主要有两种。下面的介绍直接是从网上找的看的懂的贴了份过来,其中有些修改。划分树的定义 划分树定义为,它的每一个节点保存区间[lft,rht]所有元素,元素顺序与原数组(输入)相同,但是,两个子树的元素为该节点所有元素排序后(rht-lft+1)/2个进入左子树,其余的到右子树,同时维护一个num域,num[i]表示lft->i这个点转载 2015-07-23 20:03:12 · 581 阅读 · 0 评论 -
HDU 5296 Annoying problem
这是用倍增法按照题解公式写的代码,除了题解的那种操作细节以及公式以外其他都是最简单的那种LCA…// whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostream>#include <iomanip>#include <cstrin原创 2015-07-22 16:02:44 · 1014 阅读 · 0 评论 -
HDU 5384 Danganronpa【AC自动机】
AC自动机模板题 和HDU 2222不同的是,HDU 2222每次匹配之后就要把end清空,他求的是,模式串中有多少个出现在文本串中。// whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostream>#include <ioman原创 2015-08-13 21:08:17 · 538 阅读 · 0 评论 -
HDU 5372 Segment Game
线段包含问题本身的解答是CDQ分治,时间复杂度为O(nlog(n)2)O(nlog(n)^2) 但是这题会卡你的CDQ 但是因为这题它加的线段的长度是递增的,所以能够保证的是,之前加进去的线段,如果能够被包含的一定是完全被包含,同时也就满足了:右端点左边的右端点数 - 左端点-1左边的左端点数 = 完全包含的线段个数。 CDQ的时候这维需要人工去维护,但是因为这里已经给你排序好了,就可以直接乱原创 2015-08-11 19:25:45 · 863 阅读 · 3 评论 -
【openjudge】C15C Rabbit's Festival【CDQ分治+并查集】
传送门:【openjudge】C15C Rabbit’s Festival题目分析:考虑到每条边最多只断一天,我们可以用cdq来模拟这个过程。假设当前区间为[l,r],令m=(l+r)/2,选择[l,m]区间时,我们便将[m+1,r]内的边全部使用掉,然后递归处理[l,m]部分。处理完[l,m]部分后我们将[m+1,r]回溯掉,然后将[l,m]内的边都使用掉,递归处理[m+1,r]转载 2015-05-27 20:28:19 · 775 阅读 · 0 评论 -
ZOJ 3649 倍增法DP、树链剖分、tarjan并查集
Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%lld & %lluSubmit Status Practice ZOJ 3649DescriptionThere are n individuals(2 n <= 30000). Everyone has one or more原创 2015-05-30 16:12:53 · 794 阅读 · 0 评论 -
曼哈顿距离最小生成树与莫队算法
一、曼哈顿距离最小生成树曼哈顿距离最小生成树问题可以简述如下:给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。但是事实上,真正有用的边远没有O(N2)条。我们考虑每个点会和其他转载 2015-02-14 20:37:32 · 1526 阅读 · 0 评论 -
HDU 5333 Undirected Graph【LCT+BIT】
LCT: 每次操作相当于只把区间[L,R][L,R]之间的边连起来,求联通分量的个数。 思路: 把操作排序后,对于区间[L,R][L,R]的操作,先把R所有v<Rv<R的边(R→v)(R\rightarrow v)加入集合, 用动态树+并查集维护[1,R][1,R]的联通分量的个数cnt 那么,答案==[L,R][L,R]区间的联通分量的个数+N−R+L−1+N-R+L-1; 求区间[L原创 2015-08-19 13:09:52 · 603 阅读 · 0 评论 -
Leetcode 699. Falling Squares
Leetcode 699. Falling Squares很久没有写题解了,主要是leetcode没啥有意思的题目,写来没啥意思。今天这题还算有点意思,可以分析分析。描述给你一个序列表示下落的俄罗斯方块的情况。序列里面含有 NNN 对值 (L,S)(L,S)(L, S),其中LLL表示方块下落的左坐标,SSS表示下落方块的边长,这里下落的方块永远是正方形。其中N≤1000,L≤...原创 2018-07-16 15:04:24 · 1631 阅读 · 0 评论 -
BUPT 2014新生暑假个人排位赛03
A. 学姐的数码管原创 2014-07-18 23:40:28 · 940 阅读 · 0 评论 -
HDU 5457 Hold Your Hand【最小割+字典树】
在这里先感谢YYN菊苣对我解题的帮助。首先,我们按照前缀和后缀建立两棵字典树。 节点总数为256∗8∗2256*8*2,每一个叶子节点是我们的数字。 其次,我们对读入的操作来更新字典树,假设字典树有边权,且初始化为INF,则我们每次将操作所得到的前缀或者后缀指向它的那条边取min(p→cost,cost)min(p\rightarrow cost,cost)。注意注意注意,读入的后缀也需要翻转一原创 2015-09-23 10:10:02 · 1045 阅读 · 0 评论 -
ZOJ 3899 State Reversing【NTT】
题意: 有N(有序号)个怪兽,给出M(1~M)个房间,每个房间的初始状态为1,接下来有D次操作,每次操作是选择一个区间使得区间内房间的状态反转(0->1 , 1->0),每次操作后计算将这N个怪兽放进所有状态为1的房间内,且每个状态为1的房间非空的方案数。(注意房间之间不可辨别。两种方案一样,当且仅当两种方案中存在两个房间,里面的怪兽数量以及编号一致)思路: 用线段树来更新available的原创 2015-09-16 09:09:24 · 968 阅读 · 0 评论 -
BUPT-SUMMER-TRAINING-搜索
比赛地址A - Sticks剪枝原创 2014-07-24 22:05:32 · 737 阅读 · 0 评论 -
Codeforces Round #261 (Div. 2) D. Pashmak and Parmida's problem
离散化+树状数组树状数组维护见代码原创 2014-08-16 08:53:50 · 596 阅读 · 0 评论 -
UVALive-6665-Dragons Cruller(Dij+Hash)
将所有的康托展开扫一遍,然后逆康托展开,以此求转移权值然后建图,只需要建一次图,因为状态转移是固定的然后每一次询问跑一次最短路就行(有一部分人用的是BFS+hash,(有一部分人用的是A*一开始上面两种思路觉得都会TLE,但是最后大家都没有...#include #include #include #include #include #include #incl原创 2014-11-30 01:01:43 · 685 阅读 · 0 评论 -
Zoj 3587 Marlons String
题意: 给定两个串S和T,从S中找两个子串组成T(拼起来和T一模一样),两个子串可重叠,问有几种组合方法?三种方法: KMP+计数 直接用T去匹配S,匹配到T中的T[j]时,说明长度为j的前缀出现了,更新sum[j],然后通过递归计算sum[next[i]] += sum[i]。为什么要这样计算呢?因为当某个前缀是另一个前缀的后缀时,会出现少计算的情况,更新的时候只更新后面那个前缀的出现次数而原创 2015-07-15 11:21:59 · 613 阅读 · 0 评论 -
hihocoder 1233 Boxes
打表 通过最终排序好的情况直接bfs得到合法状态的,状压的时候有多种方法。 第一种是最直接的,因为只有7个数,每个位置上最多也只可能是7个数,所以你用一个数组表示每一位有哪些块,然后用一个long long状压出你这个状态的情况,用map标记判重。 这样的复杂度会稍微大一些,可能不能直接在线打表,所以你大一个表再交上去。我们的比赛的时候程序大概88kb,杭电上就会挂了。第二种是用n进制状压,用原创 2015-09-21 18:24:38 · 676 阅读 · 0 评论 -
BUPT 2014新生暑假个人排位赛11
488. 小妹妹个数原创 2014-08-06 23:00:16 · 1522 阅读 · 0 评论 -
Palindromic Tree——回文树【处理一类回文串问题的强力工具】
今天我们来学习一个神奇的数据结构:Palindromic Tree。中译过来就是——回文树。那么这个回文树有何功能?假设我们有一个串S,S下标从0开始,则回文树能做到如下几点:1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同)2.求串S内每一个本质不同回文串出现的次数3.求串S内回文串的个数(其实就是转载 2015-05-27 21:20:57 · 1170 阅读 · 0 评论 -
HDU 5157 Harry and magic string 【Palindromic Tree】
回文树第一题,太裸了。 题目分析: 令len为字符串长度,字符串下标从0开始。从字符串最后一个字符开始插入回文树构造回文树,记录以下标i~len-1为起点的回文串的个数的sum[i]。然后再正着构造一次回文树,边构造边累加答案,设x为以下标i的字符为结尾的回文串个数,则ans+=x*sum[i+1]。 最后输出ans即可。 PS:如果想了解回文树,可以戳这里:Palindromic Tree原创 2015-08-16 10:43:41 · 556 阅读 · 0 评论 -
Tsinsen A1393. Palisection 【Palindromic Tree】
题目链接和上一题刚好相反,这个求的是所以相交的回文串的对数。 但是如果直接求比较难求,于是我们先求出上一题要求的,不相交的回文串的对数。 然后用总对数-不相交的对数,就是相交的对数。求总回文串的个数方式有几个,一种是用每一个字符所在节点的num[p]累加。这个比较直观,好理解。 一种是在count计算本质不同的回文串的时候,累加cnt。因为每次都要累加到fail节点上去,那么说明fail节点有原创 2015-08-16 12:45:27 · 573 阅读 · 0 评论 -
2014 Asia Xian Regional Contest G The Problem to Slow Down You 【Palindromic Tree】
我们对两个字符串分别建立回文树,然后分别从节点0和1开始dfs,如果两个串都可以往某一个走,则ans+=两个串该节点下cnt的乘积,然后沿着这个方向继续dfs。当然也可以用hash表示这个串,然后再累计一下A串的hash值,与B串的相同hash值的乘积。// whn6325689// Mr.Phoebe// http://blog.csdn.net/u0130079原创 2015-08-16 20:26:37 · 533 阅读 · 0 评论 -
HDU 5421 Victor and String【回文树扩展——可左右添加字符的回文树】
传送门:【HDU】5421 Victor and String能维护左右最长回文的前提是要知道除了上一个节点表示的最长回文串能更新出新的本质不同的回文串外,其他节点都做不到(比赛的时候就是这个性质没想清楚,然后想了个O(N2)的做法……),这个可以YY一下,想清楚了就简单了,分别维护左右last指针,然后用一棵回文树实现这个过程,具体过程我就不多说了。#include <stdio.h>#incl转载 2015-09-25 09:22:36 · 719 阅读 · 0 评论 -
HDU 5398 GCD Tree
这题可以基本说是LCT的模板题目,几乎没什么多余的考虑。不像HDU 5333,那题除了用LCT维护最大生成树之外还有一些复杂的公式推算。 对于多组数据,从1枚举到n,然后加入他向因子连的所有边,使用LCT维护最大生成树即可。 因子连边不知道随机顺序地连边能不能过,但是可以证明的是,如果现在枚举到ii,那么往ii最大的约数连边一定没有环,所以可以直接连边。然后也可以觉得(这个是我YY的),往小的约原创 2015-08-19 13:00:02 · 1570 阅读 · 5 评论 -
主席树/函数式线段树/可持久化线段树
什么是主席树可持久化数据结构(Persistent data structure)就是利用函数式编程的思想使其支持询问历史版本、同时充分利用它们之间的共同数据来减少时间和空间消耗。因此可持久化线段树也叫函数式线段树又叫主席树。 可持久化数据结构在算法执行的过程中,会发现在更新一个动态集合时,需要维护其过去的版本。这样的集合称为是可持久的。实现持久集合的一转载 2015-06-04 20:48:19 · 917 阅读 · 0 评论 -
跳表SkipList
1.聊一聊跳表作者的其人其事2. 言归正传,跳表简介3. 跳表数据存储模型4. 跳表的代码实现分析5. 论文,代码下载及参考资料 . 聊一聊作者的其人其事 跳表是由William Pugh发明。他在 Communications of the ACM June 1990, 33(6) 668-676 发表了Skip lists: a probabilistic转载 2015-06-01 19:38:53 · 478 阅读 · 0 评论 -
Codeforces Round #250 (Div. 1) D. The Child and Sequence
最近狂刷DS也算是有所进步了但是这题还是原创 2014-11-08 20:43:12 · 568 阅读 · 0 评论 -
【完整版】线段树(转载 NotOnlySuccess)
http://www.notonlysuccess.com/【完全版】线段树很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队转载 2014-08-19 11:07:33 · 592 阅读 · 0 评论 -
树链剖分
“在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。 树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。 记siz[v]表示以v为根的子树的节点数,dep[v]表示v的深度(根深度为1),top[v]表示v所在的重链的顶端节点,fa[v]表示v的父亲,son[v]表示转载 2014-09-22 19:09:53 · 610 阅读 · 0 评论