自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AC_Arthur的专栏

Always challenge miracles!

  • 博客(555)
  • 收藏
  • 关注

原创 UVA 1212 - Duopoly(最小割)

题目链接:点击打开链接思路:看这些限制条件, 我们很容易想到二分图,  两个公司分别建立两列结点, 表示每个订单。  关键是每个资源只能为一个公司所有,而且一旦买了一个订单, 所有资源都要全买。根据最小割, 我们如果在冲突的订单(存在相同资源)间连一条容量INF的边, 那么割掉的边就是受益最小的, 最终求出来的是最小受益,  用总的减去最小受益就行了。细节参见代码:#inclu

2016-10-02 19:27:59 645

原创 Gym - 100512F Funny Game(杂题)

题目链接:点击打开链接思路:考虑到数据量有1e5组, 那么单次操作必然为log或者是个公式题。由于每次均分, 我们其实均分完之后只看一块即可, 可以证明一下, 无论什么情况只看一块都不会出错。递归解决即可。细节参见代码:#include #include #include #include #include #include #include #include

2016-09-29 18:50:25 795

原创 UVA 1161 - Objective: Berlin(最大流)

题目链接:点击打开链接思路:一看这些约束条件和数据量, 我们就想到了网络流。由于有时间, 我们可以构造二元组(u, t)表示在城市u,时间t这个状态,  以这样的二元组作为结点跑最大流, 可惜这样结点高达150*24*60, 会TLE。我们可以考虑枚举任意两个航线, 如果满足关系, 就建边, 跑最大流。考虑到每个航线只能经过一次, 我们把航线当作结点, 拆点跑最大流即可。细

2016-09-20 16:24:41 894

原创 UVA 1194 - Machine Schedule(最大流)

题目链接:点击打开链接思路:看这些约数条件和数据范围, 很容易联想到网络流。   我们如果把流量当作答案, 那么最小割等于最大流, 我们考虑如何构建最小割。   因为每个工作的顺序随意, 所以我们只需要调整到某一个模式一次即可。   那么我们用源点到模式的流量来限制, 容量为1, 把第二个机器的模式和汇点相连,容量为1, 这样, 对于每一个工作, 向两个机器连容量为1的边,  那么对于一个

2016-09-14 19:43:29 795

原创 POJ 3422 Kaka's Matrix Travels(费用流)

题目链接:点击打开链接思路:我们用流量来限制走的次数,  因为权值在结点上, 我们考虑拆点, 因为每个点的权值只能获得一次, 我们对于每个点连两条边, 一条容量为1费用为权值, 一条容量为k-1,费用为0, 跑最大费用流就行了。细节参见代码:#include #include #include #include #include #include #include #

2016-09-14 12:50:15 534

原创 POJ 3622 Gourmet Grazers(set)

题目链接:点击打开链接思路:我们可以先排序, 先按照分数排序再按照价钱排序。  这样从前向后动态处理, 到了当前这头牛, 把商店里分数大于等于它需求的商品都加进去, 这样, 集合中所有的元素的分数都一定满足后面的, 所以分数这个因素就已经保证了。   然后set中按照价钱排序, 可以用二分快速找到价钱大于等于牛的需求的第一个产品。细节参见代码:#include #include

2016-09-08 12:54:00 496

原创 POJ 3109 Inner Vertices(线段树)

题目链接:点击打开链接思路:题目可以转化成这样的问题: 有多少个白点的上下左右都有黑点, 答案是这样的白点个数 + n怎么求符合要求的白点个数呢?按照常见思路, 我们先对黑点进行排序, 先按x再按y将其分层。  然后我们处理到了第i列, 符合要求的白点一定在相邻的上下两个黑点之间, 我们假设此时相邻两个黑点的y坐标是L和R, 那么我们要求区间[L+1, R-1]里有多少个白点的左右

2016-09-07 16:25:15 690

原创 SGU 210. Beloved Sons(二分图匹配)

题目链接:点击打开链接思路:本题可以用网络流来解, 从源点向每个王子连一条容量为国王喜爱程度的边, 每个王子向每个他喜欢的女孩也连一条容量为喜爱程度的边, 每个女孩向汇点连一条容量INF的边。一个更简单的方法是: 考虑匈牙利算法从1~n, 一定会尽量满足前面的人, 所以我们只需要按照国王对王子的喜爱程度排序之后做匈牙利算法即可。细节参见代码:#include#include

2016-09-06 22:11:30 523

原创 Ural 1671. Anansi's Cobweb(并查集)

题目链接:点击打开链接思路:由于我们对删除边之后的状态很难处理, 我们可以考虑对询问倒着处理, 转化成对集合的合并问题。细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #incl

2016-09-06 15:44:27 646

原创 UVA 11795 - Mega Man's Mission(状态压缩DP)

题目链接:点击打开链接思路:很容易想到用d[i][s]表示杀死了i个机器人了, 杀死的机器人集合是s的方法数。转移也很容易我就不说了, 我的转移复杂度是n^2的, 当然你也可以预处理一下某个机器人能被哪些机器人集合杀死, 直接用位运算与来判断, 使得转移变成O(n)细节参见代码:#include #include #include #include #include

2016-09-05 17:21:47 629

原创 UVA 10457 - Magic Car(并查集)

题目链接:点击打开链接思路:由于M只有1000, 我们可以从小到大枚举最小边, 用并查集维护连接情况, 当s和t连接时, 这时的边就是最大边。 复杂度O(m^2)细节参见代码:#include #include #include #include #include #include #include #include #include #include #inc

2016-09-05 16:26:01 1093

原创 UVA 1153 - Keep the Customer Satisfied(贪心)

题目链接:点击打开链接思路:我们按照时间从小到大排序, 因为时间最大2e6, 所以从小到大枚举时间, 当一个订单到了最后期限, 我们就看看它能否满足, 如果能就满足它, 如果不能, 我们看一下之前满足的订单中货物最多的一个是否比当前这个大, 如果大,就拿它换当前这个, 为后面节省空间。  用优先队列可以很方便的维护。细节参见代码:#include #include #inclu

2016-09-04 18:16:16 545

原创 UVA 10983 - Buy one, get the rest free(网络流)

题目链接:点击打开链接思路: 由于买一个价钱为p的航班, 那么所有对于所有价格细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #inc

2016-09-03 21:57:53 768

原创 UVA 10888 - Warehouse(最小费用流)

题目链接:点击打开链接思路:乍看该题, 很明显是个匹配问题, 但是难点在于, 你把一个箱子移动到仓库的路径上有可能存在其他箱子。但是再仔细一想, 假设A到B的路上有个C, 那么我们可以看作是A移动到C, 然后把C移动到B, 所以这种情况是不影响答案的。细节参见代码:#include #include #include #include #include #includ

2016-09-02 14:25:20 714

原创 UVA live 3938 - "Ray, Pass me the dishes!"(线段树)

题目链接:点击打开链接该题需要深刻理解线段树的特点:任意一个父结点所表示的区间都是两个儿子区间的并, 且儿子区间的交为空集。那么我们可以采用分治的思想: 一段区间的最大连续和要么来自左半边, 要么来自右半边, 或者一半在左一半在右。细节参见代码:#include#include#include#include#include#include#include#inclu

2016-08-27 18:23:27 692

原创 SGU 507 Treediff(平衡树)

题目链接:点击打开链接思路:我们要求叶子结点的值相差最小, 那么这是一个大小关系, 我们可以维护一棵平衡树, 这样, 对于每一个数, 和他相差最小的情况只能是他相邻左边或右边。但是如果开n棵平衡树, 复杂度高达n^2logn,还不如n^2暴力来的快。  我们可以采用一种叫做: 启发式合并  的技巧。 每次将一棵比较小的树合并到一棵比较大的树上。 使得复杂度达到nlogn, 证明也很简单:考

2016-08-23 21:09:28 935

原创 UVAlive 6697 - Homework Evaluation(DP)

题目链接:点击打开链接思路:用d[i][j][last][p]表示第一个串到了i位置, 第二个串到了j位置,上一个操作是last操作, 是否开始匹配的最优解。该题有坑的, 比赛时多亏队友的提示:  当第一个串匹配完毕, 第二个串剩下的部分要当作减去了。细节参见代码:#include #include #include #include #include #includ

2016-08-23 20:54:33 612

原创 HDU 5855 Less Time, More profit(最大权闭合子图)

题目链接:点击打开链接思路:最大权闭合子图的裸题,  给个学习资料:点击打开链接当结点即有正权值又有负数权值时, 怎么求任意闭合子图的最大和呢?  只要求出最小割E, 用总的正数权值TOT 减去E就是答案。细节参见代码:#include#include#include#include#include#include#include#include#include

2016-08-17 21:06:00 848

原创 HDU 5828 Rikka with Sequence(线段树)

题目链接:点击打开链接思路:对于该题, 由于存在区间加一个值, 那么所有数都可能永远不会变成1, 但是数与数之间的相对值会趋近于相等。  比如1 2 3 4 5, 进行一次根号操作变成1 1 1 2 2, 而一旦如果相等, 那么他们同时加一个数也是相等的。  所以我们增加一个标记bit[rt]表示该区间内的数是否全部相等,如果相等等于什么。细节参见代码:#include #inc

2016-08-11 20:39:37 1081 4

原创 Ural 1028. Stars(树状数组)

题目链接:点击打开链接思路:为了满足第一个条件, 我们可以先按照x坐标排序,  然后我们用树状数组来维护y坐标大小关系, 就可以在O(nlogn)的时间内求出答案了。细节参见代码:#include #include #include #include #include #include #include #include #include #include #i

2016-08-10 20:43:13 863

原创 HDU 5818 Joint Stacks(左偏树)

题目链接:点击打开链接思路:该题的关键是怎么把两个栈合并, 我们可以使用一种叫左偏树的数据结构, 满足堆的性质和集合的性质,支持在O(logn)的复杂度下进行删除堆顶元素, 插入一个元素,合并两个堆。细节参见代码:#include using namespace std;typedef pair P;const int maxn = 152400;P v[maxn];in

2016-08-10 19:57:23 934 2

原创 HDU 4455 Substrings(DP)

题目链接:点击打开链接思路:我们用d[i]表示长度为i的答案。   那么我们可以把样例数据写出来看看是否能够递推。   可以发现, d[i] = d[i-1] - last[i-1] + (n-i+1) - dist[i]。last[i]表示从后往前i长度时不同数字的个数, 也就是说, d[i-1]的最后一个子序列被扔了, 然后d[i]比d[i-1]还可能多加了( n - i + 1)

2016-08-08 20:24:20 641

原创 HDU 3237 Help Bubu(DP)

题目链接:点击打开链接思路:比赛时查一点出, 需要加一个优化才能防止超时(恶心), 状态很容易想到: d[i][j][s][k]表示前i本书拿了j本没拿的书的集合是s没拿的书的最后一本是k的最优解。为什么状态压缩的是目前桌子上的书的集合呢?  因为我们要防止一种情况:那就是如果对于高度为H的一种书, 我们都拿走了, 那么还要放回桌子上, 最优解要+1, 这样表示之后, 我们只要判断一下

2016-08-05 21:59:52 859

原创 HDU 3689 Infinite monkey theorem(KMP + DP)

题目链接:点击打开链接思路:用d[i][j]表示前i个字符,已经匹配了字母中的j个字符,最终包含这个字母的概率。每次转移的时候有n个方向, 表示第i个字符选哪个字符, 那么有个问题, 如果我当前选的这个字符失配了, 那么转移之后我还匹配了多少个字符。 这恰恰是KMP能做的。细节参见代码:#include #include #include #include #inclu

2016-08-03 20:02:09 631

原创 HDU 5787 K-wolf Number(数位DP)

题目链接:点击打开链接思路:我们用dp[cur][a][b][c][d][p]表示当前到了第cur位,前四位分别是abcd并且当前是否已经小于给定的数的方案数。  我们分别算出L和R的dp值,  以及L是否符合要求, 做差并把多减的加上即可。  比赛时写的比较恶心, 不是很美观但是很直观。细节参见代码:#include #include #include #include

2016-08-02 20:41:42 1462

原创 HDU 5441 Travel(并查集)

题目链接:点击打开链接思路:题目要求有多少对点(a, b)使得a到b的最短路上最长边不超过x。 我们将边从小到大排序, 用并查集来维护关系, 这样, 对于当前加入集合的一条边(a, b),权值为c, 他就是当前集合的最长边, 那么不大于c的对数就是就是这两个集合的个数的组合。 预处理一下即可。细节参见代码:#include #include #include #include

2016-07-31 13:52:26 614

原创 HDU 5773 The All-purpose Zero(DP)

题目链接:点击打开链接思路:首先一点:我们把所有0都用上是肯定不亏的。接下来:我们把剩下的非0数求LIS, 但是, 这些0有可能不能全部插入LIS中, 那么势必要在LIS中剔出一些数。 一个很简单的方法, 我们把每一个数减去他前面的0的个数, 这样, 相当于先为0留出了空间, 因为是全都减小, 相对大小是不变的。细节参见代码:#include #include #inclu

2016-07-28 21:30:51 1471 1

原创 HDU 4588 Count The Carries(规律)

题目链接:点击打开链接思路:数电中, 写真值表的时候, 我们是按照一定的规则写的。 按照这个规则, 我们可以知道比一个数小的数中, 每一位有多少个1。  所以, 对于每一位, 进位数就是1的个数除以2加上上一次进位的个数再除以2向下取整。细节参见代码:#include #include #include #include #include #include #include

2016-07-27 20:06:41 595

原创 Codeforces Round #363 (Div. 2)题解

这场比赛水了4个题。 部分题解如下:A. Launch of ColliderA题:我们每次遇到一个L, 就找到上一个R,他们肯定是比较近的, 这些中最近的就是最近的辣。细节参见代码:#include #include #include #include #include #include #include #include #include #inclu

2016-07-20 20:49:59 1442

原创 Codeforces Round #305 (Div. 1) B. Mike and Feet(并查集)

题目链接:点击打开链接思路:我们把元素从大到小排序, 从大到小依次合并区间, 对于第i个数, 如果他相邻左边的数比他大就合并, 相邻右边也一样。这样, 我们就求出了第i个数为最小值的最大区间。 更新答案即可。细节参见代码:#include #include #include #include #include #include #include #include #in

2016-07-17 16:53:52 1181

原创 POJ 2796 Feel Good(并查集)

题目链接:点击打开链接思路:该题转化一下, 就是枚举每一个数, 找到以这个数为最小值的最大区间(因为没有负数)。  那么一个办法是预处理出每一个数左边第一个比他大的数的位置, 和右边第一个比他大的数的位置, 这个可以用构造单调栈的线性算法处理出来: 我们构造一个单调上升栈, 标记栈里每个元素在实际中的位置, 加入一个元素a[i]的时候, 如果栈顶元素大于他, 那么将栈顶元素出队列, i就是

2016-07-15 16:55:08 1241

原创 UVA 536 - Tree Recovery(二叉树重建)

题目链接:点击打开链接思路: 二叉树有三种遍历方式, 体现在代码中, 就是:保存结点值如果是在递归前保存, 就是前序, 在递归完左子树后保存, 就是中序, 递归完左右子树后保存就是后序。由中序加上另一种, 我们可以写出剩下一种。   由前序遍历或者后序遍历, 我们可以依次知道父结点是什么, 然后在中序遍历中找到对应值, 那么该结点的左右子树分别在中序遍历中该位置的左右。 递归解决即可。

2016-07-14 15:34:22 1250

原创 Codeforces Round #271 (Div. 2) E. Pillars(线段树+DP)

题目链接:点击打开链接思路:类似于最长上升子序列, 我们很容易得到一个n^2的算法,  但是时间复杂度无法承受。可以发现, |a[i]-a[j]| >= d相当于对于每个j, 找到一个i = a[j]+d)中最大的dp[i]。  我们将数字大小离散化之后做线段树下标, 然后维护一个区间最大值就行了。 时间复杂度O(nlogn)细节参见代码:#includeusing namesp

2016-07-13 14:03:57 533

原创 SGU 311. Ice-cream Tycoon(平衡树)

题目链接:点击打开链接思路:最简单的思路是, 维护一棵平衡树, 以单价作为键值, 维护一个结点个数的信息。  然后类似寻找第K小的方法找到第n个小的价值处, 顺便维护总价值, 判断是否happy。然后就是删除操作。 我们从新从根结点开始, 沿路删除可以删除的子树就行了。 由于每次删除都是删除的叶子结点处, 所以不需要旋转操作。细节参见代码:#include #include

2016-07-10 20:53:48 1559

原创 Codeforces Round #358 (Div. 2) D. Alyona and Strings(DP)

题目链接:点击打开链接思路:类似于LCS, 只需用d[i][j][k][p]表示当前到了s1[i]和s2[j], 形成了k个子序列, 当前是否和上一个字符和上一个字符相连形成一个序列的最长序列和。细节参见代码:#include #include #include #include #include #include #include #include #includ

2016-07-09 22:03:07 1281

原创 Codeforces Round #360 (Div. 1) B. Remainders Game(中国剩余定理)

题目链接:点击打开链接思路:中国剩余定理, 请看维基百科:点击打开链接该题我们由已知可以写出n个线性同余方程:x % c[i] == a[i] % c[i]。那么中国剩余定理中明确指出。  我们可以知道 x % lcm(c[i]) 的值。   那么如果lcm可以整除k而不产生余数, 我们也就知道了x % k的值, 它就等于 x % lcm的值。细节参见代码:#include

2016-07-07 17:06:31 1380 2

原创 Codeforces Round #360 (Div. 1) C. The Values You Can Make(DP)

题目链接:点击打开链接思路:用d[i][j][k]表示, 前i个数, 选取的数之和为j, 再次选取的数之和为k的种类数。  那么当这种情况存在时, 我们把此时的k保存即可。细节参见代码:#include #include #include #include #include #include #include #include #include #include

2016-07-06 15:30:44 1464

原创 Codeforces Round #360 (Div. 1) A. NP-Hard Problem(二分图染色)

题目链接:点击打开链接思路:根据题目描述, 就是找两个不相交点集使得对于每一条边至少有一个顶点在点集中, 那么显然对于每条边必须是一个点在A集合, 一个点在B集合, 即二分图染色裸题。WA了一次, 因为有可能存在好几个连通图。细节参见代码:#include #include #include #include #include #include #include #i

2016-07-06 15:18:36 1447

原创 SPOJ 417 The lazy programmer(优先队列)

题目链接:点击打开链接思路:一开始一直在想, 对于当前的一个任务i,他到底应该花费多少合适, 因为会影响后面的决策。  后来才想明白一件事, 对于当前这个任务, 减少他的时间和减少之前任意一个任务的时间是等价的, 那么我们当然优先减少那些a比较大的。  如果当前这个任务无法完成, 那么就在之前的所有任务中找a尽量大的来减少时间。  显然, 是一定有解的。细节参见代码:#include

2016-07-04 21:27:36 1496

原创 LA 3637 - The Bookcase(DP)

题目链接:点击打开链接思路:用d[i][j][k]表示前i个, 已经占据了第一层j厚度,第二层k厚度的最小高度。 转移即可。 这题卡常数挺恶心的, 要加点恶心的优化。细节参见代码:#include #include #include #include #include #include #include #include #include #include #inc

2016-06-09 14:10:22 2279

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除