POJ
文章平均质量分 84
AC_Arthur
Die luft der Freiheit weht
展开
-
POJ-3984迷宫问题
作为BFS初学的练习。#include#include#include#include#include#includeusing namespace std;int s[20][20],d[20][20];int dx[5] = {1,0,-1,0},dy[5] = {0,1,0,-1};struct pairs{ int r,c; pairs(int r=0原创 2015-02-26 14:43:03 · 709 阅读 · 0 评论 -
POJ 3164 Command Network(最小树形图)
题目链接:点击打开链接题意:给你一个图 (单向边), 要求你找到一棵树, 根结点是1, 可以从根结点到达其他任意一个结点, 且总权值最小。思路: 模板题。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include原创 2016-03-18 16:56:46 · 645 阅读 · 0 评论 -
POJ 2513 Colored Sticks(hash + 欧拉道路)
题目链接:点击打开链接题意:n个木棍, 两端有颜色, 相同颜色可以链接, 问你最终能否形成一条线段。思路:典型的欧拉道路, 成立的条件是 1. 图联通 。 2. 度为奇数的点不能超过2个。 用map超时了, 可以用hash水过去。细节参见代码:#include#include#include#include#include#include#include#includ原创 2016-04-05 22:32:39 · 1534 阅读 · 0 评论 -
POJ 3680 Intervals(最小费用流)
题目链接:点击打开链接题意:n个区间, 每个区间有一个值, 让你选择若干区间, 使得没有一个点被覆盖超过k次的前提下的最大值。思路:我们可以把区间端点离散化然后跑费用流, 不超过k次, 我们可以把这个对应流量属性。 那么不难想到, 将区间端点作为结点, 连一条流量为1,费用为-a[i].c的边, 因为可以跳过一些点, 所以我们把每个相邻端点之间用流量INF,费用为0的边连接, 然后源点流原创 2016-03-24 14:53:56 · 1241 阅读 · 0 评论 -
POJ 3469 Dual Core CPU(最小割)
题目链接:点击打开链接题意:有n个模块要在A或B上运行, 费用分别是a[i]和b[i], 还有m个关系, 如果a[i]和b[i]不在同一个CPU上执行, 那么需要额外花费c[i]。 求最小花费。思路:首先, 很显然的是, 要把模块分成两个集合, 有一些属于A, 有一些属于B,这种将对象划分成两个集合的问题, 我们常用最小割来解决, 那么对于每个模块, 如果它属于A, 为了割断 , 要将他原创 2016-03-24 15:51:37 · 1526 阅读 · 0 评论 -
POJ 3422 Kaka's Matrix Travels(拆点+最大流)
题目链接:点击打开链接题意:给一个nXn的矩阵, 每个点有一个值, 让你从(1,1)走到(n,n)走k次, 每次只能向右或者向下走, 走到一个数字, 就得到那个值, 并且这个地方走第二次的时候不会再次获得该值, 求能得到的最大值。思路:走k次这限制我们可以用流量来解决, 关键是费用问题, 解决方法是拆点 —— 解决结点容量或者费用的通法。细节参见代码:#include#inc原创 2016-03-24 16:28:24 · 1031 阅读 · 0 评论 -
POJ 2446 Chessboard(二分图匹配)
题目链接:点击打开链接题意:给你一个n*m的棋盘, 上面有一些洞洞,要求放置若干1*2的木板, 洞洞位置不能放置, 其他位置要全部覆盖, 任意一个格子不能同时覆盖两块木板, 求能否完全覆盖。思路:二分图匹配。 相邻两个格子, 行数 + 列数 一定是一个奇数一个偶数, 由此将格子分成两派, 匹配一些即可。 可以用最大流, 但是匈牙利算法更快, 而且代码短。细节参见代码:#inclu原创 2016-04-07 11:28:02 · 2497 阅读 · 0 评论 -
POJ 3678 Katu Puzzle(2-SAT)
题目链接:点击打开链接思路:2-SAT基础题, 关键是要理解好模板的含义,然后重点在建图。在2-SAT中, 问题的关键是处理矛盾关系, 找到一个可行的解满足所有关系。 然后我们建图的时候, 连接一条有向边, 这条有向边可以理解成导出关系, a -> b。 那么我们可以由此来建立关系运算符, 以AND操作, 如果AND操作为真, 那么!a -> a, !b -> b, 代表, 如果a为假原创 2016-04-11 21:01:14 · 821 阅读 · 0 评论 -
POJ 2104 K-th Number(主席树)
题目链接:点击打开链接细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define Max(a,b) ((a)>(b)?(a原创 2016-05-12 22:29:18 · 3970 阅读 · 0 评论 -
POJ 1442 Black Box(treap树)
题目链接:点击打开链接思路:treap树模板题, 可以动态维护一个有序表, 支持在O(logN)的时间内完成插入、删除一个元素和查找第K大元素的任务。 当然, treap树能做到的还远远不止这些, 常常与其他数据结构嵌套。treap树是一种平衡二叉搜索树, 既满足堆的条件, 又满足排序二叉树的条件。细节参见代码:#include #include #include #incl原创 2016-05-13 20:22:31 · 4258 阅读 · 0 评论 -
POJ 1442 Black Box(treap树指针实现)
题目链接:点击打开链接思路:本来不想用指针实现的, 但是在做动态第K小的题目时发现, 如果不用动态申请内存的方式, 数组根本开不下。思路和静态数组模拟是一样的。细节参见代码:#include #include #include #include #include #include #include #include #include #include #incl原创 2016-05-15 21:58:15 · 1298 阅读 · 0 评论 -
POJ 2796 Feel Good(并查集)
题目链接:点击打开链接思路:该题转化一下, 就是枚举每一个数, 找到以这个数为最小值的最大区间(因为没有负数)。 那么一个办法是预处理出每一个数左边第一个比他大的数的位置, 和右边第一个比他大的数的位置, 这个可以用构造单调栈的线性算法处理出来: 我们构造一个单调上升栈, 标记栈里每个元素在实际中的位置, 加入一个元素a[i]的时候, 如果栈顶元素大于他, 那么将栈顶元素出队列, i就是原创 2016-07-15 16:55:08 · 1243 阅读 · 0 评论 -
POJ 3422 Kaka's Matrix Travels(费用流)
题目链接:点击打开链接思路:我们用流量来限制走的次数, 因为权值在结点上, 我们考虑拆点, 因为每个点的权值只能获得一次, 我们对于每个点连两条边, 一条容量为1费用为权值, 一条容量为k-1,费用为0, 跑最大费用流就行了。细节参见代码:#include #include #include #include #include #include #include #原创 2016-09-14 12:50:15 · 534 阅读 · 0 评论 -
POJ 3109 Inner Vertices(线段树)
题目链接:点击打开链接思路:题目可以转化成这样的问题: 有多少个白点的上下左右都有黑点, 答案是这样的白点个数 + n怎么求符合要求的白点个数呢?按照常见思路, 我们先对黑点进行排序, 先按x再按y将其分层。 然后我们处理到了第i列, 符合要求的白点一定在相邻的上下两个黑点之间, 我们假设此时相邻两个黑点的y坐标是L和R, 那么我们要求区间[L+1, R-1]里有多少个白点的左右原创 2016-09-07 16:25:15 · 690 阅读 · 0 评论 -
POJ 3622 Gourmet Grazers(set)
题目链接:点击打开链接思路:我们可以先排序, 先按照分数排序再按照价钱排序。 这样从前向后动态处理, 到了当前这头牛, 把商店里分数大于等于它需求的商品都加进去, 这样, 集合中所有的元素的分数都一定满足后面的, 所以分数这个因素就已经保证了。 然后set中按照价钱排序, 可以用二分快速找到价钱大于等于牛的需求的第一个产品。细节参见代码:#include #include原创 2016-09-08 12:54:00 · 496 阅读 · 0 评论 -
UVA 1221/HDU 2413/POJ 3343 Against Mammoths(二分+二分图匹配)
题目链接:点击打开链接思路:由于人类星球和外星球是一一对应的, 自然想到二分图匹配, 但是如果匹配, 必须是某人类星球能打赢某外星球才连边。 因为星球上的飞船数量随时间变化, 所以先考虑把时间固定, 然后就可以分类讨论求出在T时间内的最大匹配。 由于在T时间内能胜利, 那么大于T时间也一定能, 二分即可。细节参见代码:#include #include #includ原创 2016-10-10 12:39:59 · 863 阅读 · 0 评论 -
POJ 3538 Domestic Networks(DP)
题目链接:点击打开链接思路:选一些边, 使得任意两点都可以相互到达且花费最小, 这显然是最小生成树, 将边挑选出来之后, 如果贪心选取的话, 有可能导致无解, 所以我们考虑用动态规划。根据数据量, 用d[i][j]表示前i个边, 第一种颜料用了j单位长度下的最小花费, 因为没条边都选, 那么用总和减去j就是第二种颜料的花费。 用path[i][j]表示改状态下从哪一个状态转移过来原创 2016-10-03 16:33:09 · 982 阅读 · 2 评论 -
POJ 3373 Changing Digits(DP)
题目链接:点击打开链接思路:用d[i][j]表示前i位余数为j的最小修改次数, DP的过程中用path[i][j]表示相同状态下的下一个余数, 目的是记录路径, 用hehe[i][j]表示相同状态下该位最终的值是多少。细节参见代码:#include #include #include #include #include #include #include #inclu原创 2016-10-17 22:12:02 · 673 阅读 · 0 评论 -
POJ 2253 Frogger(最小生成树)
题目链接:点击打开链接题意:求从1到2的路径中, 使得最长路尽量小。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define Max(a,b) (原创 2016-03-05 10:20:24 · 1362 阅读 · 0 评论 -
POJ 3666 Making the Grade(DP)
题目链接:点击打开链接题意:给n个数, 要求把这个数列变成非减或者非增数列, 求最小该变量之和。思路:原创 2016-02-12 19:56:16 · 2661 阅读 · 0 评论 -
POJ 3233 Matrix Power Series(矩阵优化)
题目链接:点击打开链接题意:求S[k] = A + A^2 + ..... + A^k利用矩阵快速幂可以很快的求出A矩阵的k次方, 但是该题是求和, 如果还按照原来的方法, 将要计算k次, 复杂度无法承受。我们可以构造一个矩阵 (A 0) (E E)此时令S[k] = E + A + A原创 2016-01-12 20:03:17 · 1279 阅读 · 0 评论 -
Meteor Shower(POJ-3669)
这道题的输入部分,写错了一个符号,结果就各种WA,实在不应该,既然写一次就应该仔细,力求一遍成功。思路:用vis数组记录每个点被炸弹炸到的最近时间。用d数组记录当前时间。当d当然,因为炸弹会波及四周,所以数组应该稍微开大一点。#include#include#include#include#include#includeusing namespace std; in原创 2015-04-14 14:30:28 · 1236 阅读 · 0 评论 -
POJ 1815 Friendship(最小割+拆点法)
题意:求拆除几个点可以使得s和t不连通。典型的最小割问题,不过该题不是删除边而是删除点,又是结点容量问题,所以我们用拆点法来解决 。 对于最小割问题,也做了不少了,说说我的理解吧: 就是通过最大流算法,让两部分不连通的最小流量,所以我们可以将割裂一个点的费用表示成容量,像该题,我们要拆掉一个人,那么让结点容量为1就好,至于其他的边,因为与边无关,所以设为INF 。 该题的难点在于要原创 2015-09-01 20:29:55 · 994 阅读 · 0 评论 -
POJ 1321 棋盘问题(搜索)
暴力搜索,只要把握住几个地方就行了 :1. 我们可以按照行来放置,因为任意两个棋子不能同行,所以对于每一行,要么放,要么不放。2.我们可以用一个数组记录每一列在此之前有没有棋子,其实就是一个更简单的八皇后问题。这样已经足够通过本题的数据了,但是我们还可以添加一个剪枝:如果当前棋子数+之后的行数 细节参见代码:#include#includeusing namespace s原创 2015-10-06 17:39:01 · 507 阅读 · 0 评论 -
POJ 2251 Dungeon Master(bfs)
简单的BFS模版题。 重新审视BFS和DFS以及DP,发现三者之间存在莫大关联,总的来说,都是对状态的深入理解,以及记录状态再利用,利用状态扩展其他可能状态,以及利用状态剪枝 。 都是对状态的深入理解。细节参见代码:#include#include#include#include#include#include#include#includeusing namesp原创 2015-10-06 19:56:49 · 643 阅读 · 0 评论 -
POJ 1426 Find The Multiple(dfs)
一开始被m的位数吓到了,以为要用高精度 。 后来发现答案不会超long long,也不知道是数据水了还是本来如此。这样就很简单了, 搜索深度最多19层,每一层只有两个决策: m*10 和m*10+1 。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;t原创 2015-10-06 21:37:58 · 565 阅读 · 0 评论 -
POJ 3279 Fliptile(暴力)
该题乍看很难,如果要是dfs搜的话恐怕无法快速解决问题。但是仔细分析一下的话,会发现 : 首先,对于每个格子,翻转1次以上是没有意义的,等价于没有反转或反转一次。 所以答案不是1就是0其次,如果对答案进行暴力,再检查该答案是否符合要求,那样枚举的时间复杂度高达2^30,还是无法解决该题。 但是我们发现,对于任意一个格子,对它有贡献的只有它自己和上下左右的格子。 所以我们可以只枚举最上原创 2015-10-10 15:20:08 · 1640 阅读 · 0 评论 -
POJ 3087 Shuffle'm Up(BFS)
很多人不觉得这是个搜索,说是模拟,其实这是没有理解搜索的实质。搜索就是扩充状态和状态的转移。 该题可以将每次洗牌后的情况当成状态进行BFS,只不过这个BFS每次只有一个决策可以拓展罢了,这样当出现状态重复时将无解。那么为什么要用BFS呢? 因为循环结的周期未知,用BFS可以减少递归的无目的性。 而且该题比较简单,每层只有一个拓展点,所以用什么方法倒也无所谓。关于对状态的判原创 2015-10-11 10:54:01 · 899 阅读 · 0 评论 -
POJ 3414 Pots (BFS)
如果用状态这个术语来表示的话,那么显然,两个杯子中水的情况对应了一个状态。 所以用BFS很容易求出最小值。 该题的打印路径其实和紫书上第6张中迷宫问题用的方法是一样的,用一个父亲指针记录路劲个,这样就可以很方便的打印出路径。细节参见代码:#include#include#include#include#include#include#include#include原创 2015-10-11 19:35:13 · 575 阅读 · 0 评论 -
POJ 1651 Multiplication Puzzle(区间DP)
一道比较经典的区间DP,和这题一样:点击打开链接用dp[i][j] 表示消掉区间[i,j]内所有数字后的最优解。 那么状态转移为ans = min(ans,dp(i,k-1)+a[k]*a[i-1]*a[j+1]+dp(k+1,j)); 表示原创 2015-10-31 10:35:36 · 797 阅读 · 0 评论 -
POJ 2777 Count Color(线段树区间修改+位运算)
题目链接:点击打开链接题意:两种操作, 一个是区间修改, 一个是区间查询颜色种类数。该题因为要不断的求某个区间的颜色种类数, 我们可以用位运算的并来实现。其他的就是线段树区间修改的经典操作了。细节参见代码:#include#include#include#include#include#include#include#include#include#inclu原创 2016-01-17 15:07:42 · 1512 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments(线段树区间修改)
题目链接:点击打开链接题意:n条竖直线段,如果两条线段之间可见(即可以用一条水平线段连接而不触碰其他线段),则称它们可见。 如果三条线段任意两条都可见, 则称它们为a triangle of segments, 求a triangle of segments的个数思路: 一开始真没想到n^3的复杂度可以过。。。 如果这样的话, 问题的关键就是怎样判断任意两个线段是否可见。那么如果原创 2016-01-18 12:31:26 · 1191 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)
题目链接:点击打开链接题意:区间加减,区间求和。该题是线段树区间增减和区间求和的模板题。 和区间修改值一样, 在每个结点上维护一个之前加减的值, 那么每次经过一个结点时, 当前结点一定已经拥有所有结点信息。每次递归前下传结点信息,这就是所谓的懒惰标记。 细节参见代码:#include#include#include#include#include#include#i原创 2016-01-01 21:31:23 · 2222 阅读 · 0 评论 -
POJ 2528 Mayor's posters(线段树区间修改+离散化)
题目链接:点击打开链接题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报。该题是线段树区间修改+离散化的应用。不难想到, 每次对一个最长10^7的线段进行线段树的区间修改, 最后统计。线段树的复杂度是log10^7, 应该不会超时, 但是会超内存。 所以想到要离散化, 将区间端点值有映射成一个尽量小的值。但是该题求的是覆盖情况, 如果按照单纯的点对点的离散化, 那原创 2016-01-02 11:29:25 · 1478 阅读 · 0 评论 -
ACM 2015 亚洲区域赛北京赛区A题(二分)
该题方法就是二分, 二分R,然后在判断函数中判断在枚举点左边的绿洲面积。 这样做的复杂度是O(nlogR)。但是一开始WA了一发,后来才发现原来是因为有这样的数据:一块很大的沙漠中只有一个边长为1的小正方形绿洲。这样的数据答案是R。 所以我二分出来之后再向右推一下,直到不符合条件为止。下面是我AC代码, 二分求的上界,求下界应该更快,请读者自己实现。细节参见代码:#includ原创 2015-11-16 22:42:20 · 1143 阅读 · 0 评论 -
POJ 2828 Buy Tickets(树状数组)
题目链接:点击打开链接题意:给n个人依次插队的情况, 要求求出最终的队伍情况。该题可以用树状数组很方便的维护。如果从前向后扫的话, 每次插队都会影响这个人后面的情况, 所以我们可以倒着进行, 那么最后一个人的位置就是最终位置, 对于前面的人的位置, 只受后面人的影响, 所以等价于其最终位置是第pos[i]+1个空位。 那么也就是说要快速的找到第pos[i]+1个空位。 显然,原创 2015-12-24 20:47:36 · 854 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?(树状数组+二分)
对于可以被i整除的数的个数, 我们可以通过枚举每一个数的倍数, 预先处理出来。该题直接模拟就好, 因为每次都一定有一个人出队, 所以要枚举n次 , 对于每次, 要计算具体是哪个人出队, 这个可以用数学推导很快的算出来是当前队列的第几个人, 要找到这个人我们可以用二分+树状数组来优化算法。 复杂度O(n*logn*logn)细节参见代码:#include#include#incl原创 2015-12-26 10:43:05 · 932 阅读 · 0 评论 -
POJ 3734 Blocks(矩阵优化+DP)
题目链接:点击打开链接题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数。该题我们可以想到一个递推式 。 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数的方案数, c[i]表示红绿都是奇数的方案数。那么有如下递推可能:递推a[i+1]:1.到第i个为止都是偶数,且第i+1个染成蓝或黄;2.到第i个为止红绿恰有一个是原创 2016-01-12 18:35:46 · 1841 阅读 · 0 评论 -
POJ 3237 Tree(树链剖分)
题目链接:点击打开链接思路:对于树上的路径更新操作, 我们通常把他hash到线段上, 也就是树链剖分, 大概完全理解了吧, 存个代码。对于该题的反转操作, 可以里用异或操作的性质来做标记。细节参见代码:#include #include #include #include #include #include #include #include #include原创 2016-12-08 21:20:17 · 428 阅读 · 0 评论