上一页 1 2 3 4 5 6 7 ··· 22 下一页
摘要: 题意:完成两个操作:1.询问一个区间里第k小的数;2.修改数列中一个数的值。分析:线段树套平衡树,线段树中的每个节点都有一棵平衡树,维护线段树所记录的这个区间的元素。这样处理空间上是O(nlogn)的,因为线段树有logn层,每层的平衡树所记的节点总数都有n个。修改很容易想到,把所有包含要修改点的区间的平衡树都修改了就行了查询使用二分答案的方法// File Name: 2112.cpp// Author: Zlbing// Created Time: 2013年10月07日 星期一 18时24分39秒#include#include#include#include#include#inclu 阅读全文
posted @ 2013-10-09 18:56 z.arbitrary 阅读(1596) 评论(0) 推荐(0) 编辑
摘要: 可持久化线段树也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html这个博客总结的挺好的!区间k大数问题对于没有修改的版本,我们可以先离散化然后对权值建树。结点存储的是该权值范围内出现元素的总次数。在线段树上找k大数时就像平衡树询问k大数一样根据结点上的信息往左或者往右走。现在可以利用函数式线段树维护权值出现数量,将数列中每个结点依次插入线段树,第r次插入后的线段树与第l-1次插入的线段树之“差”(对应结点的值相减,因为按权值建树结构是一样的)得到的线段树里进行上述的查找k大数操 阅读全文
posted @ 2013-10-06 19:26 z.arbitrary 阅读(4993) 评论(1) 推荐(0) 编辑
摘要: 题意:舞会上,男孩和女孩配对,求最大完全匹配个数,要求每个人最多与k个不喜欢的人配对,且每次都和不同的人配对。分析:将一个点拆成3个点. b, b1, b2.从1到n枚举ans,判可行流. 源点s到每个b连一容量为ans边,b->b1容量inf, b->b2容量为k, 每个g到汇点连一容量为ans的边,g->g1容量inf, g->g2容量为k, 如果一个boy喜欢一个girl, 则连一条边b1->g1,容量为1, 如果一个boy讨厌一个girl, 则b2->g2, 容量为1.满足可行流条件: 最大流==ans*n. (n为boy或者girl数)// Fil 阅读全文
posted @ 2013-09-11 20:18 z.arbitrary 阅读(513) 评论(0) 推荐(0) 编辑
摘要: 题意:给出最少栏杆数使狼和羊分离分析:将狼与源点连,羊与汇点连,容量都为无穷,将图的各个相邻点连接,容量为1然后题目就转化成最小去掉多少条边使不连通,即求最小割最大流.// File Name: 3046.cpp// Author: Zlbing// Created Time: 2013/9/10 20:41:04#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define CL(x,v); memset(x, 阅读全文
posted @ 2013-09-10 21:03 z.arbitrary 阅读(802) 评论(3) 推荐(0) 编辑
摘要: 题意:给定 n 个字符串,求出现在不小于 k 个字符串中的最长子串。分析:将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,将后缀分成若干组,判断每组的后缀是否出现在不小于 k 个的原串中。如果是大于127, char 是负数, 在计数排序的时候是会出问题的。这题在输出上WA了很多次。最后下载了数据才找出来的。。。。// File Name: 3294.cpp// Author: Zlbing// Created Time: 2013年09月07日 星期六 16时21分37秒#include#include#include#include#incl 阅读全文
posted @ 2013-09-08 20:18 z.arbitrary 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 题意:长度不小于 k 的公共子串的个数分析:基本思路是计算 A 的所有后缀和 B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于 k 的部分全部加起来。先将两个字符串连起来,中间用一个没有出现过的字符隔开。按 height 值分组后,接下来的工作便是快速的统计每组中后缀之间的最长公共前缀之和。扫描一遍,每遇到一个 B 的后缀就统计与前面的 A 的后缀能产生多少个长度不小于 k 的公共子串,这里 A 的后缀需要用一个单调的栈来高效的维护。然后对 A 也这样做一次。// File Name: 3415.cpp// Author: Zlbing// Created Time: 2013 阅读全文
posted @ 2013-09-08 16:08 z.arbitrary 阅读(975) 评论(0) 推荐(0) 编辑
摘要: 题意:给定两个字符串 A 和 B,求最长公共子串。分析:字符串的任何一个子串都是这个字符串的某个后缀的前缀。求 A 和 B 的最长公共子串等价于求 A 的后缀和 B 的后缀的最长公共前缀的最大值。如果枚举 A和 B 的所有的后缀,那么这样做显然效率低下。由于要计算 A 的后缀和 B 的后缀的最长公共前缀,所以先将第二个字符串写在第一个字符串后面,中间用一个没有出现过的字符隔开,再求这个新的字符串的后缀数组。观察一下,看看能不能从这个新的字符串的后缀数组中找到一些规律。以 A=“aaaba”,B=“abaa”为那么是不是所有的 height 值中的最大值就是答案呢?不一定!有可能这两个 后 缀 阅读全文
posted @ 2013-09-07 15:13 z.arbitrary 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一个串,求重复次数最多的连续重复子串分析:比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现几次。既然长度为L的串重复出现,那么str[0],str[l],str[2*l]……中肯定有两个连续的出现在字符串中。那么就枚举连续的两个,然后从这两个字符前后匹配,看最多能匹配多远。即以str[i*l],str[i*l+l]前后匹配,这里是通过查询suffix(i*l),suffix(i*l+l)的最长公共前缀通过rank值能找到i*l,与i*l+l的排名,我们要查询的是这段区间的height的最小值,通过RMQ预处理达到查询为0(1)的复杂度,设LCP长度为M, 则答案 阅读全文
posted @ 2013-09-06 21:54 z.arbitrary 阅读(964) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个字符串,求不相同的子串的个数分析:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同 的 前 缀 的 个 数 。如 果 所 有 的 后 缀 按 照 suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), ...... ,suffix(sa[n])的顺序计算,不难发现,对于每一次新加进来的 后缀 suffix(sa[k]), 它将产生 n-sa[k] 个新 的前缀。但 是其中有height[k]个是和前面的字符串的前缀是相同的。所以 suffix(sa[k])将“贡献”出 n-sa[k]- height[k]个不同的子串。累加后便是 阅读全文
posted @ 2013-09-06 14:00 z.arbitrary 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠。分析:先二分答案,然后将后缀分成若干组。不同的是,这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。// File Name: 3261.cpp// Author: Zlbing// Created Time: 2013年09月04日 星期三 21时21分51秒#include#include#include#include#include#include#include#include#include#include#inclu 阅读全文
posted @ 2013-09-05 22:36 z.arbitrary 阅读(239) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 22 下一页