HDOJ
文章平均质量分 75
AC_Arthur
Die luft der Freiheit weht
展开
-
欧拉回路
最简单的欧拉回路,无向图,vis标记搜索过的点,用DFS搜索连通点,如果所有点都连通,则为连通图,满足第一个条件。G【】【】用来记录所有的点与其他点的连接情况,每个点的集合里,点的奇偶就是边的奇偶。来源:HDOJ 1878#include#include#include#include#includeusing namespace std;int vis[1200];原创 2015-02-26 20:57:07 · 785 阅读 · 0 评论 -
HDU 2732 Leapin' Lizards(拆点法+最大流)
该题是一道比较简单拆点+最大流的题目,因为每个柱子都有一定的寿命,很容易将其对应成流量,那么处理结点容量的一般方法当然是拆点法 。该题反而对边的容量没有要求,为保险起见可以设成无穷大。 该题的思路很好想,建议独立编写代码 。推荐题目: 点击打开链接 结点法的一些见解 也可以看这里。细节参见代码:#includeusing namespace std;typedef lon原创 2015-08-30 17:13:39 · 1309 阅读 · 0 评论 -
HDU 3572 Task Schedule(最大流Dinic算法)
该题非常经典,建图的方法非常巧妙,因为每个任务的完成不一定要连续,而且可以换机器完成,而且我们注意到时间点最多500,很小,所以我们将时间点抽出来建图。对于每个任务,将其时间范围内的点与之连起来,容量显然为1 ,并与汇点相连,容量为p[i] 。 对于每个时间点,因为最多可以有m台机器同时工作,所以容量为m 。一开始老想着任务和机器之间怎么建立联系了。细节参见代码:#include原创 2015-08-30 20:54:06 · 1327 阅读 · 0 评论 -
HDU 1565 方格取数(1)(最大独立点权覆盖 | 最小割)
该题是一道经典的求最大点权独立集问题的题目 。 关于定义我就不多说了 。 说一下几个重要的关系 :1.最大流 = 最小割 = 最小点权覆盖集 = sum - 最大点权独立集 。因此,该题其实还可以用最小割来做,思想是相同的 。 因为我们不能取相邻的数字,所以很容易联想到最小割 。那么我们可以先给每个格子编号1或2,形成二分图。 然后由1到2连边 。容量INF,与源点和汇点相连的原创 2015-08-31 10:24:35 · 981 阅读 · 1 评论 -
HDU 5119 Happy Matt Friends(DP)
求解方案数的简单DP,比赛时没有往DP上想,思维比较局限。状态转移很好写,类似于背包,我用记忆化搜索写的容易写,但是效率比较低,还占内存,读者可以改成递推式,还可以改成滚动数组,因为每一层的状态只用到它上一层的状态 。细节参见代码:#include#include#include#include#include#include#include#include#inclu原创 2015-08-31 21:36:43 · 848 阅读 · 0 评论 -
HDU 1217 Arbitrage(Flody)
Flody的变形,初始化所有d[i][i] = 1,其他为0。 这样在Flody的时候取大就行了。 然后检查所有点d[i][i]是否有大于1的。细节参见代码:#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;原创 2015-09-07 20:53:50 · 533 阅读 · 0 评论 -
Building Block(并查集)
该题是个比较明显的并查集题目,只不过需要求的不是一个集合中元素的个数,而是某个数下面的积木个数。显然,我们需要维护一些量,来达到计算的目的。 为了使得并查集高效,我们显然不能放弃了路径压缩,那样会导致并查集退化成一条长长的链,效率十分低下。但是我们可以注意到,由于路径压缩的缘故,每次遍历到的点都会被直接连到祖先结点上。那么我们可以维护一个under数组,以under[i]表示结点i之下原创 2015-09-06 10:25:23 · 630 阅读 · 0 评论 -
HDU-1533 Going Home(二分图匹配)
最近开始做最小费用流的题目,该题是二分图完美匹配下的最小权匹配,所谓完美匹配就是说从源点流入的总流量等于从汇点流出的总流量,在这种状态下的最小费用 。 那么显然是要套用最小费用流模板,另外二分图匹配的第一步就是要划分集合,划分两个集合,集合A与源点相连,集合B与汇点相连,至于容量和权值就要依据题目而定 。比如该题,因为每个小人恰好能对应一个房子,所以每个小人与汇点的容量为1,房子与汇点的容原创 2015-08-21 10:32:31 · 872 阅读 · 0 评论 -
HDU 2489 Minimal Ratio Tree(最小生成树)
该题就是最小生成树算法的变形,由于这个比值没有什么规律,不可能一下子算出最小情况,我们可以很容易发现,结点数非常少,所以我们可以枚举出m个结点的所有组合,这样,结点权值只和就确定了,为了使得比值最小,那么就要使得边权值之和最小,也就是最小生成树模板了。枚举n个数中的m个可以有两种方法: dfs和二进制枚举子集。该题我用的二进制,感觉比较方便。细节参见代码:#include#inc原创 2015-09-06 21:09:56 · 583 阅读 · 0 评论 -
HDU 2473 Junk-Mail Filter(并查集 | 删除操作)
该题比较经典,是并查集的删除操作。 并查集一般是用来合并和判断是否在一个集合的,因为这种树状结构如果真的删除一个结点,难说其结构会如何变化,难以高效的维护。但是我们仍然有办法解决,我们可以通过给每个结点不断更新编号,让删除的点变成虚点,由于最多进行10^6次操作,因此,最多10^6+最大结点数个结点,开这么大的数组即可。细节参见代码:#include#include#include原创 2015-09-06 15:44:32 · 617 阅读 · 0 评论 -
HDU 3533 Escape(BFS)
一看就是BFS,但是该题不是很好处理。 给的时限很宽裕,所以对于各个炮塔的状态判断其实是可以在BFS里现算的。我一开始想将各个炮塔在d秒范围内的状态先算出来然后存在数组中,结果MLE,换了个bool型的数组终于勉强存下了。 然后就开始WA,后来才发现原来子弹的途中只要有炮塔就会被阻挡,而不是炮塔被击中时才阻挡子弹。 这样就可以AC了,还有就是HDU的di'scuss里的数据是错误的,炮原创 2015-10-17 10:54:52 · 662 阅读 · 0 评论 -
HDU 4771 Stealing Harry Potter's Precious(BFS)
就是一道简单的BFS,由于要拿到所有宝藏,那么我们可以状态压缩宝藏集合, 为了使得状态表示完整,就需要在状态数组d中多增加一维。比较常见的题型。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int I原创 2015-10-18 08:55:40 · 644 阅读 · 0 评论 -
HDU 4770 Lights Against Dudely(二进制枚举子集)
题目中有一个重要提示: 脆弱的房间最多只有15个,而且灯只能放在脆弱的房间(否则一定会照到坚固房间),而且一个房间只能放一个灯,所以枚举所有子集就行了O(2^15)。一开始没看清题意,以为所有的灯都可以任意朝向,后来才知道只有一个灯可以任意朝向。 所以我们再枚举那个灯是特殊的灯就行了。总复杂度O(15*2^15),可以接受。细节参见代码:#include#include#inc原创 2015-10-18 09:41:15 · 666 阅读 · 0 评论 -
变形课(DFS)
水题#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int mod = 1e9 + 7;const int INF = 1e9;const int maxn =原创 2015-10-20 17:12:07 · 692 阅读 · 0 评论 -
HDU 2824 The Euler function(筛法求欧拉phi函数)
该题就是一个筛法求欧拉phi函数值,我预处理了前缀和,没想到比直接求还慢。。。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int maxn =原创 2015-10-06 08:36:51 · 968 阅读 · 0 评论 -
HDU 1016 Prime Ring Problem(水题纯暴)
直接DFS就行,连剪枝都不要。 因为要打印所有可能解,也没法剪枝 。因为相邻的元素之和要求互素,所以能成立的解很少,解答树并没有想象中那么大。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;type原创 2015-10-20 16:23:41 · 615 阅读 · 0 评论 -
HDU 2612 Find a way(BFS)
一开始想法比较傻,对每一个KFC为起点BFS,后来发现其实我们只需要对这两个人为起点BFS一遍就行了,将遇到的每个KFC记录在vector里,但是WA,后来又发现不需要保存的vector里,直接用两个数组记录路径就OK了,成功AC。 之前那个方法肯定也行,不知道哪里出现了BUG。。。细节参见代码:#include#include#include#include#include原创 2015-10-09 17:11:40 · 471 阅读 · 0 评论 -
HDU 1495 非常可乐(BFS)
很简单的BFS,由于一个小小BUG,调了一个晚上~再次接触搜索专题,有了一丝不一样的感觉,再看紫书,才明白其中的一些精华 。其实,搜索和动归简直是密不可分,什么BFS啊DFS啊其实都是搜索,手段都是一样的,目的也是一样的。对于搜索,现在逐渐重视到了一个之前忽视的东西:状态。 其实搜索的就是状态,定义的也是状态,剪枝剪掉的还是状态,记忆化搜索保存的也是状态。对于一个搜索,你会遍原创 2015-10-09 21:36:54 · 663 阅读 · 0 评论 -
HDU 4455 Substrings(递推+优化)
该题是一道极好的递推+优化的题目(有很多人喜欢把递推归为DP,其实递推不具备DP的特点)。因为对于每一个序列都要多次查询,每次查询长度为w的连续子序列中不同元素之和。 一开始确实没想到用递推,经验太少吧。 如果我们用d[i]表示长度为i的答案,那么由于子序列是连续的,所以d[i]和d[i-1]是有很大关系的。 首先很容易看出,d[i]的子序列比d[i-1]少一个,很容易发现,少了d[i-1原创 2015-11-09 20:45:43 · 553 阅读 · 0 评论 -
HDU 4739 Zhuge Liang's Mines(DP)
该题一开始没想出怎么暴力, 其实我们可以先预处理出来所有的可能正方形,存到一个vector里,然后用dp的思想就行了。因为最多只有20个点,所以我们可以状态压缩一下,然后状态转移就是d[S] = max(ans,dp(ss)+4); 如果当前这个正方形所组成的点完全在S中,那么ss就是S去掉这四个点后的状态,如此转移就可以了。细节参见代码:#include#include#in原创 2015-11-10 22:39:23 · 595 阅读 · 0 评论 -
HDU 5497 Inversion(树状数组)
树状数组好题。 我们都知道可以用树状数组求一个序列的逆序数,但是之前一直没有深刻理解为什么要用树状数组,通过该题可以知道,我们正确的思维应该是先面对一个问题,然后思考如何解决问题,然后才能对其中遇到的困难有一个深刻的认识,然后就能知道为什么需要这样解决,为什么要用树状数组。因为我们需要这样的数据结构。该题要求删去一个长度为m的连续序列后逆序数最小值。由于长度是固定的,所以由滑动窗口我们原创 2015-11-09 22:16:03 · 836 阅读 · 0 评论 -
HDU 3874 Necklace(树状数组离线处理)
想了一下午没有想到好办法,看了一下别人思路,该题需要离线处理。这个方法可以很好的处理重复数字的问题,用来求解无重复数字的区间和问题。将询问的区间按照右端点排序,每次记录上一个区间的右端点R,然后遍历R到当前区间右端点,用一个数组记录每一个数字出现的位置,如果该数字出现过,那么删除上一次出现的位置的值,并更新到当前位置。 这样就可以有效的去重 。 由于整个过程只是遍历了一遍数组,所以原创 2015-09-22 19:45:51 · 657 阅读 · 0 评论 -
HDU 2102 A计划 (BFS)
简单BFS,注意好状态转移过程 即可,还有就是一旦踏入传送机,立刻会被传送,所以要立刻改变z坐标细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const in原创 2015-10-13 22:05:52 · 701 阅读 · 0 评论 -
HDU 2181 哈密顿绕行世界问题(水DFS)
该题乍看很难的样子,其实就是个水DFS,因为要打印所有可能方案,所以无法剪枝,直接遍历所有可能情况就行。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;cons原创 2015-10-28 16:11:51 · 731 阅读 · 0 评论 -
HDU 1043 Eight(BFS打表+状态去重)
该题是一道经典的八数码问题,难点在于对状态的定义和判断该状态是否访问过。 紫书上列举了三种方法:set存,hash,编码解码。编码解码的原理是利用了康托展开,我们都知道,对于一个长度为n的序列,其全排列一共有n!种,利用康托展开我们可以快速的求出一个排列是按照字典序的第几个排列。这样我们就将每个排列(状态)与一个n!内的整数对应起来了。 但是这样还是会超时,无奈我想到了既然终点状态固定,原创 2015-10-29 14:01:58 · 713 阅读 · 0 评论 -
HDU 2874 Connections between cities(LCA离线算法)
该题用离线算法的时候要注意会MLE, 内存卡的很紧, 所以要想办法优化内存, 利用存储边的数组就行了。 LCA是利用了并查集在树上进行的操作, 由于该题可能不形成一棵树,所以要对所有子树进行LCA。 然后不在一个集合中的两个点不能联通。细节参见代码:#include#include#includeusing namespace std;typedef long long ll;原创 2015-11-20 16:57:39 · 950 阅读 · 0 评论 -
HDU 2438 Turn the corner(三分)
昨天个人赛的题目,没有做出来,今天学了一下三分,其实很简单,就是用来求一个凸函数或凹函数的最值的方法。大家可以看这个博客,讲的很清楚 :点击打开链接然后该题就是设拐的角度为自变量,范围0~pi/2 。 然后三分就行了。 这样就可以求出最大值是多少了,然后如果最值比y小,就可以过去,否则不可以。值得一提的是,队里有人用暴力过了,他将拐点设在了车的中间(l/2处),然后暴力的转角,每次原创 2015-10-31 10:49:48 · 670 阅读 · 0 评论 -
HDU 2586 How far away ?(LCA)
该题是一道比较基础的LCA(最近公共祖先),也就是快速求出树上任意两个点的最近公共祖先, 然后顺便维护边权值(每个结点到root的距离),就可以快速求出任意两个结点的距离了。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long原创 2015-11-17 22:41:54 · 611 阅读 · 0 评论 -
HDU 5212 Code(容斥)
题意: 输入n个数, 求这n个数的n^2个两两组合的最大公约数x,x(x-1)之和 。换个思路, 我们如果求出了最大公约数为x的对数cnt, 那么答案就增加x(x-1)cnt^2那么怎么求以x为最大公约数的对数呢?我们枚举x的整数倍, 这样就可以知道这些数中是x的整数倍的数有多少个。原创 2015-12-12 15:09:34 · 802 阅读 · 0 评论 -
HDU 5596 GTW likes gt(multiset)
该题其实只需要利用multiset维护一下就可以了。根据题意, 利用题目特点, 可以发现, 如果正着枚举的话, 前面的对后面的会产生影响, 但是, 如果我们倒着枚举就可以避免这个情况。所以我们不妨先记录每个时间点释放魔法的次数, 然后倒着枚举, 这样当前这个数的能力值就是v+res (res为当前附加的魔法值, 因为后面时间增加的魔法,对于前面时间也一定增加了)。 所以,原创 2015-12-13 11:30:42 · 814 阅读 · 0 评论 -
HDU 2337 Escape from Enemy Territory(BFS+二分优化)
该题比普通的BFS多加了一些限制条件。 一个是:首先要满足在这条路径上距离敌人的最近距离尽量大。 第二个是:路程尽量最短。最短路当然是BFS求, 可是怎么确定这个最近距离呢? 我一开始搞了个优先队列, 按照这个值从大到小排序, 可是后来yy了一下,发现是不对的, 因为当前最大,不一定后来还是最大的路径, 所以会丢失最优解 。后来想了一个方法:再开一个数组记录之前经过这个点的最近距离,原创 2015-11-27 22:41:56 · 834 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树区间修改)
题目链接:点击打开链接题意: 输入一个n表示一段长度为n的区间,有n个编号为1~n的点,初始值全部为1。 有q个操作, 每个操作有3个数:l,r,v表示将区间l~r的所有元素修改为v。求经过q次修改后的整个区间的值之和。该题是最典型的线段树区间修改问题, 需要用到所谓的懒惰标记。 听起来挺难的,其实非常简单, 其原理如下:因为修改很多值, 如果还是按照原来的更新方法, 每个结点原创 2016-01-01 20:24:42 · 4414 阅读 · 0 评论 -
HDU 5606 tree(并查集)
题目链接:点击打开链接题意:一棵树,权值只有0和1,找到每个点与之相距最近的点的个数, (包括这个点自己,也就是说,等价于找每个点与之相距为0的点的个数)。用并查集乱搞就行了, 如果边权为0就合并集合, 并在集合的根节点上维护一个信息:该集合中点的个数。细节参见代码:#include#include#include#include#include#include#inc原创 2016-01-04 11:00:41 · 1664 阅读 · 0 评论 -
HDU 5207 Greatest Greatest Common Divisor(暴力)
和很多题目的思路是一样的, 因为如果直接二重循环枚举的话时间复杂度是承受不了的, 所以我们不妨换个思路, 先预处理出来没个数出现的次数, 然后从1枚举到最大值i, 对于每个i , 我们找它的倍数, 那么它的倍数肯定以它为最大公约数(因为是从大到小枚举的), 如果超过两个, 则存在以i为最大公约数的两个数, 那么这个i也就是最大的。细节参见代码:#include#include#incl原创 2015-12-21 09:14:49 · 772 阅读 · 0 评论 -
HDU 3085 Nightmare Ⅱ(双向BFS)
经典的双向BFS, 可以使得世间复杂度大大降低。因为男生和女生每秒走的步数不一样,所以我们可以利用BFS的特点,以每一层作为一个单位来BFS细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include原创 2015-12-02 21:29:45 · 844 阅读 · 0 评论 -
HDU 5592 ZYB's Premutation(二分+树状数组)
昨晚有事没打BC,今天补一补, 这是昨晚第三题,对于一个1~n的序列, 告诉我们每个数前面有多少个比他大的数, 要求我们还原序列。不难发现, 如果我们倒着看的话, 假设当前第i个数是ans[i], 它前面有a[i]个比他大的数, 那么他就是删除后面已经求出的数字后的数组中第a[i]+1大的数。不难想到,将原序列的数当作树状数组的下标, 值为1, 这样就能利用bit快速求出比当前数大的数字还原创 2015-12-06 13:25:40 · 1351 阅读 · 4 评论 -
HDU 5591 ZYB's Game(博弈)
该题是昨晚的BC第二题, 一道挺简单的博弈题。对于博弈题, 关键是要找出必败态或者必胜态。 不难发现, 当所选择的数字是当前数组的中间数字时, 无论怎么选, 对手都能恢复到这个局面,那么当前选手必败。所以所选择的数字不是原数组的中间数字, 那么先手必胜。细节参见代码:#include#include#include#include#include#include#inc原创 2015-12-06 10:47:29 · 809 阅读 · 0 评论 -
HDU 5493 Queue(二分+树状数组)
题目链接: 点击打开链接题意:有n个人排队,每个人都有一个独一无二的身高,告诉你每个人的身高和他前面或者后面的比他高的人的个数(到底是前是后是未知的)。 要求你还原原来的队列,并且字典序最小。思路: 因为要求字典序最小, 我们可以先按照身高从小到大排序,假设当前到了第i高的人, 他前面或者后面有k个人, 那么他前面的所有人都比他矮, 比他高的还有n-i个人,那么假设他前面还有p个空位,原创 2015-12-23 22:39:29 · 1489 阅读 · 0 评论 -
HDU 1166 敌兵布阵(线段树版)
该题之前用树状数组写过, 最近在学习线段树, 用线段树重新写了一遍。在学习一种新的数据结构之前, 最重要的是要理解其结构是什么样子的, 这个可以参照《算法竞赛入门经典》P199页。 比较重要的是理解好几个变量:1. 每个结点有一个编号。 这个编号对应了其所统治的区间, 我们从线段树的祖先结点开始从上到下, 从左到右的顺序给所有结点编号,这样, 编号为i的结点其左右结点的编号就是2i原创 2015-12-24 10:57:46 · 1144 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树-区间求最值&&单点修改)
线段树基础题,区间最值,单点修改细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define Max(a,b) ((a)>(b)?(a):(b))#de原创 2015-12-24 11:58:59 · 802 阅读 · 0 评论