ACM竞赛
文章平均质量分 83
Die luft der Freiheit weht !
AC_Arthur
Die luft der Freiheit weht
展开
-
manacher算法
ACM退役很久了, 不过仍然喜欢解决一些很酷的算法。至此之后, 这里将会是一个纯净的算法讨论阵地, 和比赛无关, 但是希望能将算法的原理和做法讲解明白。很后悔在做ACM的时候没有这么做。博客推荐这个, 可以很快了解一下这个算法的做法:点击打开链接那么我还是简单说一下。我们从左往右扫描字符串枚举中点。算法维护了一个最右边的点, 这个是当前存在的回文串的最右边能到原创 2017-09-05 19:37:02 · 905 阅读 · 0 评论 -
Codeforces Round #404 (Div. 2) 题解
题目链接:点击打开链接这次比赛AC了4个水题, 然而我zz了E题写了个bug调了很久没时间写D啦。A. Anton and Polyhedrons水题, 加一加就行了。B. Anton and Classes排序就行了, 我们肯定是在一个区间集合中找一个右端点最小的, 在另一个集合里找一个左端点最大的。C. Anton and Fairy Tale我们可以发现,原创 2017-03-16 05:46:10 · 1380 阅读 · 0 评论 -
Codeforces Round #396 (Div. 2)D. Mahmoud and a Dictionary(带权并查集)
题目链接:点击打开链接思路:带权并查集水题。 带权并查集可以知道在一个集合里的两点间距离。那么这种同义反义关心恰好对应距离的奇偶。附上一图:这就是合并的过程。细节参见代码:#include #include #include #include #include #include #include #include #include #includ原创 2017-02-09 01:46:48 · 480 阅读 · 0 评论 -
Codeforces Round #395 (Div. 2) 题解
比赛链接:本次比赛解决3题(好水呀QAQ)A. Taymyr is calling you水题暴力代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #inc原创 2017-02-03 00:48:54 · 906 阅读 · 1 评论 -
HDU 1007 Quoit Design(分治)
题目链接:点击打开链接思路:经典的分治法, 网上讲解很多我就不多说了, 这是nlognlogn复杂度, 大多数情况是够用的。。优化了一下排序函数, 跑了780ms细节参见代码:#include #include #include #include #include #include #include #include #include #include #inc原创 2017-01-17 22:23:37 · 507 阅读 · 0 评论 -
HackerRank Even Tree(树dp)
题目链接:点击打开链接思路:简单证明了一下,贪心不可行, 那么我们考虑树形dp。 用d[u]表示以u为根的子树的最优解。 u的儿子v,如果以v为根的子树数目为偶数, 那么可以考虑选择断掉u和v的边(决策1), 也可以不断, 递归下去(决策2)。细节参见代码:#include #include #include #include #include #include原创 2017-01-26 16:18:29 · 740 阅读 · 0 评论 -
BNUOJ 27935 我爱背单词(FFT)
题目链接:点击打开链接思路:该题暴力当然可以过, 如果数据量加大, 我们还有一种nlogn的算法:FFT仔细观察这个复习单词量的累加方式可以发现, 这是一个卷积, 可以用FFT加速算法。细节参见代码:#include #include #include #include #include #include #include #include #includ原创 2017-01-12 23:16:15 · 1036 阅读 · 0 评论 -
Codeforces Good Bye 2016(部分题解)
本次比赛一共AC了前4题...A. New Year and Hurry水题。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl原创 2016-12-31 19:29:48 · 893 阅读 · 0 评论 -
Codeforces Round #389 Technocup 2017 E. Santa Claus and Tangerines(二分+DP)
题目链接:点击打开链接思路:我们二分答案, 那么这就变成了一个二分求下界的问题了。 关于判定我采用了一种记忆化搜索的递归方式, 简单证明了一下应该可以达到log的复杂度。细节参见代码:#include #include #include #include #include #include #include #include #include #include原创 2016-12-25 21:07:07 · 734 阅读 · 0 评论 -
玲珑杯 1074 - Pick Up Coins(区间DP)
题目链接:点击打开链接思路:用d[l][r]表示这个区间的最大值。 那么我们枚举区间的某个数, 表示这个数是区间内最后一个选的数。 所以他的临近元素是a[l-1]和a[r+1]。14年北京赛区原题...细节参见代码:#include #include #include #include #include #include #include #include原创 2016-12-24 16:13:34 · 828 阅读 · 0 评论 -
玲珑杯 1072 - Capture(DFS序+线段树)
题目链接:点击打开链接思路:不难发现, 这是一棵树, 把树先建立好, 跑dfs序, 然后就变成了线段树区间修改、单点修改、区间最值。细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include原创 2016-12-24 15:22:02 · 850 阅读 · 0 评论 -
Codeforces Round #388 (Div. 2)D. Leaving Auction(水题呀?)
题目链接:点击打开链接思路:我们只要把每个人竞价的最大值存起来, 并且把每个人的所有竞价维护在一个有序数组(方便二分), 对于一组询问, 我们从大到小遍历这k个数,把不在这k个数的最终竞价最大的两个人找到(复杂度O(K)), 然后在竞价最大的那个人的set里二分第二大的人的竞价最大值就行了。细节参见代码:#include #include #include #include原创 2016-12-20 22:02:50 · 945 阅读 · 0 评论 -
Codeforces Round #384 (Div. 2)D. Chloe and pleasant prizes(树DP)
题目链接:点击打开链接思路:比较简单的树DP, 用dp[u][id]表示当前以u为根的子树还已经找到几个子树的最大值。 转移比较多, 一方面可以转移到某一个儿子, 表示问题在以后解决, 一方面如果id==1说明还要找1个子树,可以直接用val[u]更新, val[u]表示该子树的和。 如果id == 0说明还要找两个子树, 我们用两个最大的儿子值更新即可。细节参见代码:#in原创 2016-12-19 20:20:09 · 866 阅读 · 0 评论 -
POJ 3237 Tree(树链剖分)
题目链接:点击打开链接思路:对于树上的路径更新操作, 我们通常把他hash到线段上, 也就是树链剖分, 大概完全理解了吧, 存个代码。对于该题的反转操作, 可以里用异或操作的性质来做标记。细节参见代码:#include #include #include #include #include #include #include #include #include原创 2016-12-08 21:20:17 · 434 阅读 · 0 评论 -
Codeforces Round #200 (Div. 1) D. Water Tree(dfs序+线段树)
题目链接:点击打开链接思路:dfs序其实是很水的东西。 和树链剖分一样, 都是对树链的hash。该题做法是:每次对子树全部赋值为1,对一个点赋值为0,查询子树最小值。该题需要注意的是:当我们对一棵子树全都赋值为1的时候, 我们要查询一下赋值前子树最小值是不是0, 如果是的话, 要让该子树父节点变成0, 否则变0的信息会丢失。细节参见代码:#include #in原创 2016-12-07 19:04:09 · 510 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan(dfs&lcm)
题目链接:点击打开链接思路:很简单的一道题, dfs之后求n个数的lcm就行了, 从网上扒下来一个lcm,mdzz死循环了。。不对的代码你贴个XX细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #原创 2016-12-07 11:49:19 · 727 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(DP)
题目链接:点击打开链接思路:在宿舍打CF不敢使劲敲键盘, 最后没交上D也怨不了别人。 挺水的DP, 就是个背包。细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include原创 2016-12-07 11:23:37 · 594 阅读 · 0 评论 -
CDOJ 1292 卿学姐种花(分块)
题目链接:点击打开链接思路:由于是一个区间更新问题, 而且更新的值不一样, 所以我们考虑分块。 对于一个块, 我们维护第i块的第一个元素被加了多少了sum[i],第i块被更新了多少次cnt[i], 那么对于一个块内, 元素依次增加sum[i]递减cnt[i], 这是一个等差数列。细节参见代码:#include #include #include #include #inc原创 2016-12-06 17:53:16 · 716 阅读 · 0 评论 -
主席树
附上主席树代码, 以示我完全理解了主席树:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define Max(a,b)原创 2016-12-05 21:01:29 · 570 阅读 · 0 评论 -
51NOD 1640 天气晴朗的魔法(二分+最大生成树)
题目链接:点击打开链接思路:我们二分最大的边, 这显然是符合二分性质的, 然后使得边权和最大用最大生成树就行了。细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include原创 2016-11-30 21:20:08 · 571 阅读 · 0 评论 -
51NOD 1272 最大距离(线段树)
题目链接:点击打开链接思路:问题简化一下就是, 求任意一个数后面大于等于它的数中距离它的最远距离。 因为有两个特征:“大小”, “距离”, 我们可以用线段树下标表示数的大小, 距离作为值, 就变成了求区间最大值的问题了。细节参见代码:#include #include #include #include #include #include #include #in原创 2016-11-30 14:18:49 · 561 阅读 · 0 评论 -
51 NOD 1521 一维战舰(并查集)
题目链接:点击打开链接思路: 倒着用并查集合并就行了, 一边合并一边统计, 当能放置的船数大于等于k就停止。细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #原创 2016-11-28 22:48:52 · 663 阅读 · 0 评论 -
HDU 4366 Successor(分块)
题目链接:点击打开链接思路:把题目转化一下就是: 求一个区间内所有大于能力值v的人中忠诚度最大的是哪个人。我们考虑分块, 对于一个块内的人, 我们另开一个数组维护, 将块内的人按照能力值排序, 二分这个能力值, 之后还要维护一个左端点变化的区间最大值, 预处理即可。细节参见代码:#include #include #include #include #inclu原创 2016-11-11 12:29:17 · 599 阅读 · 0 评论 -
E. XOR and Favorite Number(莫队算法)
题目链接:点击打开链接思路:莫队算法适用于无修改操作的区间问题。 关键是, 需要能够用O(1)时间从[l, r]转移[l+1, r], [l-1, r], [l, r+1], [l, r-1]。该题需要观察异或和的特点, 它是满足区间加减的。 区间[l, r]的异或和等于[1, r] - [1, l-1]。 那么我们用莫队算法维护每个点的前缀异或值, 就是可以完美解决这个问题原创 2016-11-09 15:41:43 · 796 阅读 · 0 评论 -
Vijos P1988 自行车比赛(treap)
题目链接:点击打开链接思路:如果我们判断第i个人是否能第一, 只需要把尽量小的分值给分数最大的人, 如果有人超过了他, 就不能得第一。我们可以把n个人排序, 让2~n个人分别加上n-1~1, 用treap维护最大值。 转移到下一个人的时候, 只需要把下一个人的加分加到当前这个人上就行了。PS:用treap的原因是set被卡了。 吐槽:set太慢了。细节参见代码:#inclu原创 2016-11-03 21:31:15 · 787 阅读 · 0 评论 -
Vijos P1987 游戏(DP)
题目链接:点击打开链接思路:类似背包, 很容易想到用d[i][j][s]表示前i个数字选了j个和为s的情况是否存在, 复杂度略高, 考虑到这是个布尔类型, 可以用bitset转移, 复杂度/6, 这样就可以过掉全部数据了。细节参见代码:#include #include #include #include #include #include #include #inc原创 2016-11-03 17:25:29 · 632 阅读 · 1 评论 -
HDU 5945 Fxx and game(DP+单调队列)
题目链接:点击打开链接思路:用d[i]表示从i变到1的最小花费, 那么如果i % k == 0, 转移到d[i/k], 还可以转移到min(d[i-t, i]), 我们可以发现这是一个区间最小值, 用线段树维护即可, 但是该题时间卡的很严, 线段树会TLE, 那么我们还可以用单调队列搞一搞。复杂度O(n)。细节参见代码:#include #include #include原创 2016-11-01 16:09:29 · 664 阅读 · 0 评论 -
ZOJ 3216 Compositions(矩阵优化DP)
题目链接:点击打开链接思路:ZOJ挂了, 理论AC一下。用d[i]表示数i的拆分方案。 转移是个难点, 我们可以考虑转移到d[i-1]表示对于当前这个拆分出的数进行+1修改, 转移到d[i-k]表示之前拆分的数不变了, 新增加一个拆分数k。然后构造矩阵就很简单了。原创 2016-10-21 20:27:46 · 790 阅读 · 0 评论 -
UVA 10779 - Collectors Problem(网络流)
题目链接:点击打开链接思路:我们以1~m建立一列结点,表示Bob的物品, 以2~n建立一列结点, 表示其他的人。 源点和1~m相连, 容量为Bob的初始数量; 汇点也和1~m相连, 容量为1, 表示最终种类的限制, 如果有一个人i有物品j, 那么i向j连容量为i拥有的个数-1,表示只会给他重复的物品; 否则, j向i连容量为1的边, 表示最多给i一个(不要重复的)。 细节参见代码:原创 2016-10-21 16:05:40 · 533 阅读 · 0 评论 -
UESTC - 1251 谕神的密码(DP)
题目链接:点击打开链接思路:根据数据范围, 很容易确定用d[i][j]表示前i位和为j是否能组成符合要求的数字。 用path[i][j]表示下一个状态的j值, hehe[i][j]表示当前状态选了哪个数字。特判n == 1 && s == 0。细节参见代码:#include #include #include #include #include #include #原创 2016-10-19 20:28:18 · 609 阅读 · 0 评论 -
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 · 690 阅读 · 0 评论 -
UVA 11261 - Bishops(杂题)
题目链接:点击打开链接思路:象可以沿着对角线走任意距离, 直接枚举保存复杂度n*m*log(nm), 肯定超时, 考虑到数学方法: 同主对角线上y-x的值相同, 同一副对角线上x+y相同, 且连续分布。所以我们考虑枚举主对角线的值, 如果这个值出现过, 那么这一个对角线的所有点都会被攻击, 否则, 我们维护这个区间的副对角线被占有的值的个数。复杂度O(nlogn)细节参见代原创 2016-10-13 16:41:53 · 628 阅读 · 2 评论 -
Ural 1542. Autocompletion(二分)
题目链接:点击打开链接思路:因为单词最长15, 我们把每个单词不同长度的前缀存起来, 排序之后二分即可, 复杂度O(nlogn)细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include原创 2016-10-11 16:05:03 · 500 阅读 · 0 评论 -
UVA 1221/HDU 2413/POJ 3343 Against Mammoths(二分+二分图匹配)
题目链接:点击打开链接思路:由于人类星球和外星球是一一对应的, 自然想到二分图匹配, 但是如果匹配, 必须是某人类星球能打赢某外星球才连边。 因为星球上的飞船数量随时间变化, 所以先考虑把时间固定, 然后就可以分类讨论求出在T时间内的最大匹配。 由于在T时间内能胜利, 那么大于T时间也一定能, 二分即可。细节参见代码:#include #include #includ原创 2016-10-10 12:39:59 · 876 阅读 · 0 评论 -
POJ 3538 Domestic Networks(DP)
题目链接:点击打开链接思路:选一些边, 使得任意两点都可以相互到达且花费最小, 这显然是最小生成树, 将边挑选出来之后, 如果贪心选取的话, 有可能导致无解, 所以我们考虑用动态规划。根据数据量, 用d[i][j]表示前i个边, 第一种颜料用了j单位长度下的最小花费, 因为没条边都选, 那么用总和减去j就是第二种颜料的花费。 用path[i][j]表示改状态下从哪一个状态转移过来原创 2016-10-03 16:33:09 · 991 阅读 · 2 评论 -
UVA 1212 - Duopoly(最小割)
题目链接:点击打开链接思路:看这些限制条件, 我们很容易想到二分图, 两个公司分别建立两列结点, 表示每个订单。 关键是每个资源只能为一个公司所有,而且一旦买了一个订单, 所有资源都要全买。根据最小割, 我们如果在冲突的订单(存在相同资源)间连一条容量INF的边, 那么割掉的边就是受益最小的, 最终求出来的是最小受益, 用总的减去最小受益就行了。细节参见代码:#inclu原创 2016-10-02 19:27:59 · 660 阅读 · 0 评论 -
Gym - 100512F Funny Game(杂题)
题目链接:点击打开链接思路:考虑到数据量有1e5组, 那么单次操作必然为log或者是个公式题。由于每次均分, 我们其实均分完之后只看一块即可, 可以证明一下, 无论什么情况只看一块都不会出错。递归解决即可。细节参见代码:#include #include #include #include #include #include #include #include原创 2016-09-29 18:50:25 · 817 阅读 · 0 评论 -
UVA 1161 - Objective: Berlin(最大流)
题目链接:点击打开链接思路:一看这些约束条件和数据量, 我们就想到了网络流。由于有时间, 我们可以构造二元组(u, t)表示在城市u,时间t这个状态, 以这样的二元组作为结点跑最大流, 可惜这样结点高达150*24*60, 会TLE。我们可以考虑枚举任意两个航线, 如果满足关系, 就建边, 跑最大流。考虑到每个航线只能经过一次, 我们把航线当作结点, 拆点跑最大流即可。细原创 2016-09-20 16:24:41 · 907 阅读 · 0 评论 -
UVA 1194 - Machine Schedule(最大流)
题目链接:点击打开链接思路:看这些约数条件和数据范围, 很容易联想到网络流。 我们如果把流量当作答案, 那么最小割等于最大流, 我们考虑如何构建最小割。 因为每个工作的顺序随意, 所以我们只需要调整到某一个模式一次即可。 那么我们用源点到模式的流量来限制, 容量为1, 把第二个机器的模式和汇点相连,容量为1, 这样, 对于每一个工作, 向两个机器连容量为1的边, 那么对于一个原创 2016-09-14 19:43:29 · 804 阅读 · 0 评论 -
POJ 3422 Kaka's Matrix Travels(费用流)
题目链接:点击打开链接思路:我们用流量来限制走的次数, 因为权值在结点上, 我们考虑拆点, 因为每个点的权值只能获得一次, 我们对于每个点连两条边, 一条容量为1费用为权值, 一条容量为k-1,费用为0, 跑最大费用流就行了。细节参见代码:#include #include #include #include #include #include #include #原创 2016-09-14 12:50:15 · 549 阅读 · 0 评论