算法竞赛入门经典 训练指南
aozil_yang
这个作者很懒,什么都没留下…
展开
-
UVA - 11468 Substring (AC自动机 + 概率dp)
题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S(每次独立随机)。给出K个模板串,计算S不包含任何一个模板串的概率(即任何一个模板串都不是S的连续子串)。思路:多模式匹配,显然的Ac自动机, 每个字符都有一个概率, 就是很显然的自动机 + dp了令dp[i][j] 表示构造字符串的第i 位, 在自动机节点j 不包含病毒串的概原创 2017-08-31 21:16:30 · 303 阅读 · 0 评论 -
LA 3026 && POJ 1961 Period(KMP求前缀的最短循环节)
题意:给定一个长度为n 的字符串s,求它的每个前缀的最短循环节?思路:我们想一下KMP的next 函数。next[i]表示 由S[0],S[1],,,,S[i] 构成的字符串的最大前缀长度 使得前缀等于后缀。那么这个问题就很好办了。假设当前枚举到i 位置了。(目前字符串的长度是i)假设最短循环节是X。那么next[i] 一定是i - X;所以我们只需要判断i 是原创 2017-03-28 22:16:44 · 498 阅读 · 0 评论 -
UVA 1267 && LA 3902 Network (思路--树上的DFS)
大体题意:给你n 个节点的树,其中叶子节点是客户端,内部的节点是服务器!你需要把一些服务器变成VOD,使得每个客户端到最近VOD的距离不超过K,开始的时候,已经有了一个VOD ,标号是s(也是根节点),求在最少安装多少VOD使得上述描述成立!思路:本以为是一个dp,看了分析后,感觉想的太复杂了!先把无根树转成有根树,其实这已经是一个有根树了,把S作为根节点,然后dfs 求出每一个节原创 2016-12-06 15:43:53 · 372 阅读 · 0 评论 -
UVA 12124 Assemble (二分 + 字典树)
大体题意:你有b 元钱,要组装一台电脑,有n 个配件,属于不同的种类,你要在每一种配件里选择一个配件,使得品质最差的配件尽可能的大,问最差配件的最大值!思路:解决“最小值最大”的常用方法是二分答案。我们可以二分答案 x, x 即可品质最差的配件的质量!然后我们开始枚举每一种配件,我们在每一种配件质量大于等于x 的配件中选择一个最便宜的!当质量与钱数均合适的情况下,这个答案x原创 2016-12-05 22:34:08 · 344 阅读 · 0 评论 -
UVA 12097 Pie LA 3635 (二分)
大体题意:给你n 个圆形派,有F+1个人来分这n 个派,每个人得到派的面积必须一样大,求最大面积(派必须是完整的,不能拼接!)思路:二分,我们直接二分答案x,看这个x合适不合适的标准是 能不能在n 个圆形派中,分出面积为x 的个数不少于f+1个,不行的话,继续搜!一个面积为S的派能分面积为x 的个数为 S/x详细见代码:错了很多遍,注意二分的边界问题!!#inclu原创 2016-12-05 22:22:25 · 358 阅读 · 0 评论 -
UVA 11300 Spreading the Wealth (思路题目)
大体题意:坐在圆桌上有n 个人,没人有一定数量的金币,你的目的是使得没个人的金币都一样,你的分金币方法是可以把手里的金币分给相邻的人,问最少分的数量!思路:很巧妙的一道题目,书上说的很详细,简单记录一下!假设每个人的金币数量是a1,a2,a3,,,,an,第一个人得到的金币数是 x1, 第二个得到的金币数是x2,,,,,,依次类推:会得到一个等式:(拿样例举例子)原创 2016-12-12 00:13:27 · 447 阅读 · 0 评论 -
UVA 1161&& UVALive 3645 Objective: Berlin (最大流 -- 时序模型)
大体题意:给你一些航班,你要从s 城市到t 城市,中间可以倒航班,倒航班的时间不得小于30分钟! 告诉你最晚的到达时间,求最大客流量?思路:求最大客流量很明显是求最大流!然后 加了时间 在赛场上就蒙蔽了!其实是时序模型!我们把航班看成一个点,然后拆成i和i + m,这样就考虑了时间的因素! 表示i 的时间更早一些,i+m 的时间更晚一些!只能由i到i+m ,容量为飞机上原创 2016-10-29 10:59:32 · 417 阅读 · 0 评论 -
Uva 10911 Forming Quiz Teams(状压dp 最优配对问题)
大体题意:给你2*n 个人,每个人告诉你所处的坐标(二维坐标),要求两两配对,使得配对后距离之和最小?思路:纯粹的最优配对问题!通过这个问题来复习一下 最优配对!记忆化搜索明显递推要快!令dp[s]表示状态s 进行两两配对的最小距离之和!可以这么思考 :先找到前i-1 项除了j 配对最优解,令 i 和j 进行配对!那么只需要枚举j 即可!那么这样的话,i原创 2016-10-24 20:36:21 · 531 阅读 · 0 评论 -
UVALive - 5009 Error Curves (三分法)
大体题意:给你n 个开口向上的抛物线,给你一个新的函数F(x),他的值是n 个抛物线的最大值,求Fx在[0,1000]的最小值?思路:三分法:画一个抛物线可以知道,他是一个下凸函数,也有可能是一条直线,直线也可以看成是一个下凸函数!画两个抛物线,无论这两个抛物线位置如何,还是一个下凸函数!画多了就知道,无论怎么画抛物线,n个抛物线组成的fx 还是一个下凸函数!因此存在唯原创 2016-09-06 15:46:26 · 627 阅读 · 1 评论 -
UVA 11990 ``Dynamic'' Inversion (分块 )
题意:给你n 个数的排列,和q 个操作,每个操作删除一个数,在删除每个数之前 输出当前的逆序对。思路:动态逆序对一般用分块乱怼一波就好了。建立两个分块,一个存有序的数,另一个是未排序的。删除x的话, 把x 不在的分块直接二分 找 大于x的数 和小于x的数。对于x 在的分块,直接o(sqrt n)查询一下就好。注意有序vector 和无序vector的删除,这里傻笔了,w原创 2017-03-29 19:27:35 · 415 阅读 · 0 评论 -
UVA 12003 Array Transformer (分块)
题意:给你n 个数,和m 个操作,m 个操作先查询 [L,R]上比x 小的个数, 在根据这个数 对 某个数进行变换。思路:真的是xjb 操作啊,直接分块怼就行。直接建立一个有序的分块即可。然后就是删除vecror 和插入排序。#include #include #include #include #include using namespace std;typ原创 2017-03-29 20:33:11 · 590 阅读 · 0 评论 -
UVA - 1076 || LA 4126 Password Suspects (AC自动机 + 状压DP + 打印解)
题意:让你构造一个长度为n 的串, 告诉你m个串, 要求长度为n 的串 必须包含m 个串, 问你有多少种方案。如果方案数 思路:不看输出方案。很明显一个自动机 + 状压的题目。令dp[i][j][k] 表示 构造字符串的第i 位, 目前在自动机的j 结点, 包含m 个串的状态为k 的方案数。那么直接转移就好了。但是要打印解 。 感觉这里比较乱 想了好久。因为自己原创 2017-09-06 20:23:43 · 1006 阅读 · 0 评论 -
UVA - 1326 Jurassic Remains (折半搜索)
题意:给你n 个串(仅包含 大写字母), 要求选择尽可能多的串,使得 所有的字母出现次数均为偶数次。思路:真的蜜汁题意, 比赛结束都没读懂。。。。18s 时间很充足, 2^24 直接爆可以过。。记录一下 折半搜索。总共24个串, 暴力是2^ 24我们可以先枚举前一半,把前一半的答案 存起来。 在枚举后一半 , 直接看对应的答案是否存在即可。对于这个原创 2017-08-27 21:45:37 · 306 阅读 · 0 评论 -
UVA 10075 Airlines (Floyd + 数学转换)
题意:告诉你n个点的经度 和 纬度, 告诉你m 个有向边, q 个查询 ,求两点的最短路。思路:显然裸floyd就是这个两点之间距离比较恶心了。我们直接以球心为圆点, 建立XYZ直角坐标系。球心连接 经度 0 的位置。 然后就好求 任意点的xyz 坐标了。假设纬度 是wd(弧度), 经度是jd(弧度)那么X = R * cos(wd) * cos(jd)原创 2017-08-23 18:50:14 · 283 阅读 · 0 评论 -
UVA 11354 Bond (最小生成树 + 树链剖分)
题意:给你一个图, q 个查询, 每个查询输出两点之间 的路径中 最大值的最小值。思路:要想路径最大值最小, 边肯定在最小生成树上。先把图建成最小生成树。那么问题就是 输出树上两点之间的 边权最大值。赤裸裸的树剖。可惜比赛时脑残没有想到 最小生成树。#include #include #include #include using namespac原创 2017-08-21 17:41:43 · 282 阅读 · 0 评论 -
UVA - 12083 Guardian of Decency (匈牙利算法 求 最大独立集)
题意:给你 n 个人的 性别 身高, 喜欢的运动和音乐。 告诉你一些两个人能在一起的条件, 问 最多多少人 在一起?思路:有性别之分。可以建成一个二分图。然后反向建边, 如果男i 和 女j 不能再一起 就连一条边。然后这样, 二分图的最大独立集 就是 答案。 所有人都不连边, 所有人都可以在一起。总数 - 最大匹配数 即是答案。#include #include原创 2017-08-21 16:27:10 · 351 阅读 · 0 评论 -
UVA 1232 || LA 4108 (线段树)
题意:按先后顺序告诉你每个长方形的左边界和右边界和高度, 求总覆盖度? 当前长方形的覆盖度为 左右的长度 使得他自己的高度最大。思路:很明显线段树。我们直接按照输入顺序依次更新。线段树里结点存的是线段,而不是点。记录这个区间高度最大值,最小值。当最大值小于等于h 时, 在递归更新。直到不能更新或者 区间全都比h小为止。这样会TLE,要加个剪枝。当前更新为h 时原创 2017-07-29 02:41:57 · 343 阅读 · 0 评论 -
UVA 1455 Kingdom (线段树 + 并查集 + 离散化)
题意:给你n 个城市,初始时,没有任何双向道路相连接。两种操作:1. 将A点和B点连接。2.询问一条y = C的水平线 和多少个连通块 多少个点连接。思路:因为询问只是涉及到y 坐标。并且数据较大。我们直接存下所有的y 坐标 离散化一下。然后就可以建立线段树了。线段树维护两个值 一个时连通块个数,一个是点的个数。操作1 ,我们维护每个连通块 y 坐标最大和最原创 2017-07-31 17:25:04 · 318 阅读 · 0 评论 -
UVA 11107 Life Forms(后缀数组+二分)
思路:后缀数组+二分:我们先把n 个字符串用不同的字符连接起来,注意最后要加上一个字符。然后求这个字符串的后缀数组。然后二分答案,判断长度len 是否可行。 判断方法是同样的套路,给sa数组进行分块,每一块都大于等于长度len,然后判断每一块是否有超过一半的串在这一块中出现, 可以开一个flag数组, 记录每一块的字符串, 最后统计flag数组即可。这样我们二分得到了最长长度l原创 2017-05-03 22:36:27 · 400 阅读 · 0 评论 -
UVA - 10635 Prince and Princess (二分法 求最长上升子序列)
大体题意:给你两个数组,求最大公共子序列的长度?思路:数据很大,直接求最大公共子序列会超时!需要转换 一下,因为题目中说 不会出现重复数字,所以可以给第一个数组 重新编号,那么可以映射到第二个数组,第二个数组没有在第一个数组中出现的就不要了,因为肯定不在公共子序列中!转换完成之后,公共子序列肯定是第一个数组的子序列,并且第一个数组是严格递增的!因此公共子序列也是严格递增的!原创 2016-09-06 15:24:09 · 396 阅读 · 0 评论 -
UVA 11542 Square 乘积是平方数(高斯消元)
思路:和HDU 5833 一样,只不过这次uva数据稍微少一点而已!通过这次题目懂得了,高斯消元 题目,消元都是小事,难点在于构造矩阵!例如有4个数 4,6,10,15.素因子只有2,3,5. 2,3,54 -> (2,0,0);6 -> (1,1,0);10 ->(1,0,1);15-> (0,1,1);因此可以构造一个对2取原创 2016-08-15 00:28:52 · 694 阅读 · 0 评论 -
UVALive - 3882 And Then There Was One (递推[dp])
大体题意:给你一个由n 个数(1~n)组成的圆环,刚开始删除m,以后每数k 个数删除一个数,求最后剩下哪个数?思路:这个题数据量比较大,什么数组模拟,链表模拟, 都会超时!这个题目不就是猴子选大王吗= =!看了看相关约瑟夫问题的讲解,感觉很巧妙!简单记录一下:有这么一类问题:给你1~n 的圆环,你从1报数,报到m 停止删除这个数,继续报,求最后的人?因为涉及到取余问原创 2016-09-05 21:21:39 · 450 阅读 · 0 评论 -
UVA - 11995 I Can Guess the Data Structure! 猜猜数据结构(STL模拟)
大体题意:有两种操作 1 x 把 x 放到集合里。2 x 在x中取出的第一个元素是x问这个集合是优先队列还是普通队列 还是栈。还是不能确定 还是不可能!思路:直接拿着三个东西模拟一下即可!比较简单 具体不多说了,详细见代码:#include#include#include#include#includeusing namespace std;prior原创 2016-07-10 14:57:42 · 748 阅读 · 0 评论 -
UVA - 1329 Corporative Network 合作网络(并查集)
大体题意:有n 个结点,初始时每个结点的父节点都不存在。你的任务是执行一次I操作和E操作,格式如下:I u,v 把结点u 的父节点设置为v,距离为|u-v|%1000 保证u没有父节点。E u,询问u到根节点的距离!思路:并查集:用d[u]表示u结点到根节点的距离。每次E操作都初始化父节点和 距离!每次I操作 都要查一下父节点,find,在find过程中更新d数原创 2016-07-10 14:31:25 · 396 阅读 · 0 评论 -
UVA - 11235 Frequent values 频繁出现的数值(RMQ)
大体题意:给你n 个元素的非降序排列的数组,给你m 个询问i,j,求出 区间[i,j]内出现次数最多数的次数!思路:RMQ算法是求某个区间内的最小值或最大值!这个问题关键是转换到RMQ问题上去!因为数组呈非降序,所以所有相等的元素会聚在一起!所以可以把数组分成一块一块的, val[i]表示第i块 数值是多少,cot[i]表示第i块出现了多少次!num[p]表示数组位置p原创 2016-07-10 13:18:06 · 572 阅读 · 0 评论 -
UVA 1428 || LA 4329 PingPang (树状数组)
大体题意:街道上住着n 个 人,每个人都喜欢打乒乓球,他们之间会互相切磋,那组织一场乒乓球比赛需要三个人,一个裁判,两个运动员,要求裁判的能力值要介于两个运动员之间,并且位置也在他们之间,问最后有多少种选法?思路:输入完n 个数后,统计 在a[i]左边比a[i]小的个数 有sml[i]个,那么大的就有i-1-sml[i]个,在统计右边比a[i]小的个数 smr[i]个,那么大的个数就原创 2016-07-10 00:55:07 · 432 阅读 · 0 评论 -
UVA - 11636 Hello World! (STL)
题意不说了。思路:先要快速接近目标n 所以 不断取2 4 8 16 32... 直到恰好小于n为止,这时在加1就可以了STL 中的lower_bound 恰好实现这个功能!#include#include#includeusing namespace std;int a[35];void init(){ a[0] = 1; for (int i原创 2016-05-29 22:36:41 · 309 阅读 · 0 评论 -
UVA 11806 Cheerleaders 拉拉队
虽然是个例题 学到了很多东西!设全集是S 。第一行没有石子是A最后一行没有石子是B第一列没有石子是C最后一列没有石子是D。则解就是在全集S中,但不再A、B、C、D任何一个子集合中!技巧:用二进制表示状态:A 1000 ---8B 0100 ---4C 0010 ---2D 0001 ---1知识:百度一下集合论 有一个定理:A U B =原创 2016-02-26 00:19:15 · 589 阅读 · 0 评论 -
LA 3644 X-Plosives 易爆物
题目大意:一个化合物包含两个元素,一旦发现K个化合物中恰有K种元素,则会爆炸,应该禁止上车!问禁止上车化合物的数量!思路:类似于单词接龙,把元素看成顶点,化合物看成边,存在环的时候是危险的,可以在输入的时候判断,就是x,y在同一个集合中时,就禁止上车!注意:注意输入格式 多组数据!#includeconst int maxn = 100000 + 10;int pa[原创 2016-02-23 13:43:39 · 375 阅读 · 0 评论 -
例题5-1 UVA 11292 The Dragon of Loowater勇者斗恶龙
很简单的一道题,输入完骑士和恶龙后,sort排序,然后扫面骑士,发现骑士大于等于恶龙,费用就加,否则继续循环,直到恶龙到n及时跳出循环:#include#includeusing namespace std;const int maxn = 20000 + 5;int Knight[maxn];int Dragon[maxn];int main(){ int n,m;原创 2015-12-17 00:04:08 · 425 阅读 · 0 评论 -
UVA - 10652 Board Wrapping (二维凸包)
大体题意:给你n 个长方形,可以任意旋转,求得一个多边形,把长方形都包括在内,最后输出 长方形的面积和 与 多边形面积的比值!思路:二维凸包,将长方形的四个顶点输入,最后求得凸包便是多边形,统计下面积即可!#include#include#include#include#includeusing namespace std;const double eps = 1e-原创 2016-08-18 01:26:38 · 347 阅读 · 0 评论 -
UVA 11437 Triangle Fun 三角形趣题 (二维几何)
题意不说了 ,看图就看懂了= =!思路:本来还想是一个纯数学计算题目,算了许久没算出来,经队友指点 恍然大悟!= =!根据输入的A,B,C三个点坐标算出 AB BC CA 三个向量来!再算出 AD BE CF 三个向量, 再算出 三个向量的交点来 就是 R P E 在构造一遍向量 用叉积算出面积即可!既然输出整数, 注意四舍五入!#incl原创 2016-08-18 11:26:51 · 790 阅读 · 0 评论 -
UVA - 10341 Solve It (数学--二分法求解)
大体题意:给你一个函数,给你定义域,求出是否有解,有解输出解,无解输出 No solution思路:分析式子和输入 知道这个式子是一个单调递减的,那么就可以用二分了!当两个端点 的函数值乘积大于0时,说明同号,则无解!否则有唯一解! 直接二分找就可以了!教训:这种求解方程的二分,涉及到小数的二分 ,最好用循环多少来解,不要用l #include#include原创 2016-09-05 19:51:39 · 380 阅读 · 0 评论 -
UVA - 10534 Wavio Sequence (二分法最长上升子序列)
大体题意:给你一个长度为n 的数组,要求求出一个长度为奇数并且最长的上升子序列(不一定连续),要求前k + 1项严格递增,后k+1项严格递减!输出最大长度?思路:最长上升子序列,因为n 最多是10000,我们必须用n log n 级别的复杂度!我们可以先预处理,求出到每一个位置i 的最长上升子序列的长度!在倒着求,倒着枚举求出每一项的最长上升子序列长度! (这样反过来原创 2016-09-05 19:47:08 · 679 阅读 · 0 评论 -
UVA - 10125 Sumsets (预处理 + 二分)
大体题意:给你一个最大长度为1000的数组,让你从中找出四个不同的元素 a,b,c,d,满足 a + b + c == d如果存在 就让d 尽可能的大,否则输出no solution思路:把等式变换一下 a + b == d - c;那么我们可以先两层循环,求出所有的a + b 来,然后再两层循环枚举 d 和c,二分 a+b,看看满不满足!这样复杂度n*n log n级原创 2016-09-05 15:54:00 · 384 阅读 · 0 评论 -
UVA 11388 GCD LCM(思路)
大体题意:告诉你某两个数的最大公约数GCD,和最小公倍数LCM,求满足条件的a,b 中a 的最小值!思路:想一想就知道了,根本不用暴力求解!LCM肯定是GCD的倍数,不是的话就-1,否则就一定存在!!!!!然后要a最小,GCD和LCM不就满足吗,ab的最大公约数是GCD,那GCD不就是满足条件的最小值吗!!输出即可!#include#include#include原创 2016-09-17 01:05:06 · 916 阅读 · 0 评论 -
LA 3266 || UVALive 3266 Tian Ji -- The Horse Racing 田忌赛马(贪心)
大体题意:田忌与齐王赛马,他们有n 匹马,告诉你每匹马的速度,田忌赢一场得200,输一场扣200,平局不赚不扣,求最高赚多少?思路:贪心思路都给双方排个序,从最快的 马开始枚举,如果田忌的当前的马快于齐王的马,那么这局肯定赢,直接得200。如果慢与齐王,那么这局肯定赢不了,既然赢不了,那不如用田忌当前最慢的马去输齐王当前最快的马。如果与齐王速度相同,那么这局也赢不了,那原创 2016-09-04 10:25:45 · 485 阅读 · 0 评论 -
UVALive - 4256 || LA 4256 Salesmen 商人(DP)
大体题意:给你一个包含n个结点无向图,在给你一串序列,最终的目的是让这一串序列 任意相邻的两个数在无向图中能直接相连,或者这两个数相同!求最少改变几个数?思路:DP:令dp[i][j]表示 当前走到序列的 第i 个位置, 序列的值为j 的最少修改数!那么在处理时 我们找出与j 相邻的数 (或者相等)的k ,dp[i][j] = min(dp[i][j],dp[i-1][原创 2016-09-04 15:57:14 · 332 阅读 · 0 评论 -
UVA - 11524 InCircle 内切圆 (数学)
题意:如图 有一个内切圆 告诉你内切圆的半径R, 并且三角形 比例知道 m1 : n1 m2 : n2 m3 : n3,注意 这些只是比例,并不是实际长度,刚开始以为一个大水题,结果样例都不对,错误的认为那是实际长度了!思路:需要知道一个内切圆的半径公式:因此我们设AB = m1 x + n1 x;可以将三角形三边表示出来!将三边带入内切圆半径公式即原创 2016-08-19 11:20:07 · 635 阅读 · 0 评论 -
UVA 11646 Athletics Track (简单数学题)
大体题意:如图:告诉你长和宽的比 为a : b 求出 长度和宽度的实际值!思路:令长为ax, 宽为bx!那么====》由于勾股定理:带入得:答案就是ax : bx了!代码:#include#include#include#include#includeusing namespace std;int main(){原创 2016-08-19 01:18:07 · 329 阅读 · 0 评论