
ACM竞赛
文章平均质量分 73
84970000
算法工程师
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
POJ 1182 食物链
是一道挺不错的并查集题目。不同于普通原创 2014-07-29 00:16:21 · 612 阅读 · 0 评论 -
hdu 4819(二维线段树)
生涯过的第一道二维线段树!其实思维上没有什么难度啦,就是裸的二维线段树模板题。#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#include#includeusing namespace std;const int maxn = 801;int num[maxn][maxn原创 2015-08-09 17:37:19 · 796 阅读 · 0 评论 -
poj 1947(树形背包问题)
题意:给定一棵树,求获取一棵节点数为p的子树需要切割的边的最小数量做法:定义数组dp[i][j]为以i为根节点获取节点数为j的树需要切割的最小的边的数量。对于i的一个子节点v,如果不要以v为根节点的整棵子树,那么dp[i][j]=dp[i][j]+1(因为要切割i与v的相连的边)。否则,可以枚举以v为根节点的子树的大小,假设为W,那么dp[i][j]=min(dp[i][j].dp[i][j-原创 2015-08-10 11:01:33 · 613 阅读 · 0 评论 -
CodeForces 547B(单调栈)
题目地址:http://codeforces.com/problemset/problem/547/B题意:有一个长度为n的序列,序列有长度为1...n的连续子序列,一个连续子序列里面最小的值称作这个子序列的子序列的strength,要求出每种长度的连续子序列的最大的strength。做法:我们可以求出每一个数所在的一个区间,使得这个区间里面该数是最小的。那么,对于每个长度i(1原创 2015-08-24 13:44:20 · 1289 阅读 · 0 评论 -
POJ 1830(高斯消元)
过的第一道高斯消元题,继续加油。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #i原创 2015-08-27 01:08:02 · 402 阅读 · 0 评论 -
HDU 5335 walk out(特殊bfs)
题意:在一个只有‘0’和‘1’的矩阵中,找一条从(0,0)到(n,m)的字典序最小的一个路径。做法:bfs。但是不能每条路径都搜,要按照一定层次的搜。如果(0,0)是‘0’,就从(0,0)开始找一个离终点最近的且值为‘0’的点。然后,从那个点开始进行按照层次来进行bfs。每个点的层次就是坐标的x和y加起来的值。每搜索一个层次,就找出该层次中最小的值,并将该层次中与最小值一样的点搜索到下一层。这原创 2015-07-31 16:04:43 · 492 阅读 · 0 评论 -
hdu 5305 (搜索+剪枝)
题意:有n个人(n做法:建成一个图,如果边的数目是奇数或者有人的度数是奇数,那个方法数肯定是0。否则,我们可以将边进行染色。假设黑色代表两个人之间是线上朋友,白色代表两个人之间是线下朋友。那么要满足条件,必须全部边有一半被染色,并且对于每个人相连的边有一半被染色。我们可以取一半的边进行染色,然后判断是不是每个人的一半相邻边被染色。这样,耗时为C(14,28)。加上一些情况的剪枝,就能顺利通过!原创 2015-07-24 11:17:17 · 632 阅读 · 0 评论 -
HDU 3966 Aragorn's Story(树链剖分)
树链剖分的点剖分(相对应的是边剖分)。算是很基础的树链剖分模板题吧。将树的链分成一段段连续的区间,然后应用到线段树中,就可以实现树上两点之间的路径查询了。#include#include#include#include#include#include#include#include#include#include#include#includeusing namespa原创 2015-09-09 21:26:46 · 308 阅读 · 0 评论 -
POJ 3237(树链剖分)
这道题算是树链剖分的模板题吧(其实也是我过的第一道树链剖分的题目)。历尽千辛万苦,终于把两百多行的代码敲出来了,ac的一瞬间还是挺爽的。在学会了树链剖分之后,这道题不算很难的了,主要是在区间取反的部分注意一下细节。树链剖分代码挺长的,很多地方都是容易写错。我也是通过讨论区的acmer给出的数据找出一些错误的地方。#include#include#include#include原创 2015-09-08 22:21:13 · 436 阅读 · 0 评论 -
HDU 3613(Manacher算法)
题意:字母表的26个字母都有一个价值,给定一个字符串,将该字符串切成两份,对于每一份,如果是回文串,就获得该子串的字母价值之和,否则该子串的价值为0。求出将字符串切成两份后能够获得的最大价值。做法:先用Manacher算法求出以每个字母为中心的回文串的长度,并计算该字符串的前缀价值和。然后枚举切割点,得到两份子串。这样就可以知道每个子串的中心点,然后检查以该子串的中心点作为中心点的回文串的长度原创 2015-08-20 10:57:19 · 1607 阅读 · 0 评论 -
HDU 5442 (串的最大表示+KMP)
题意:一个环形的字符串长度为n,求出长度n的字典序最大的子串,如果多个符合的子串,取顺时针起始字符下标最小的子串,如果从该起始字符的顺时针和逆时针得到结果相同,取顺时针的那个。做法:这道题据说可以用后缀数组、后缀自动机之类的重型兵器解决,也可以用字符串的最大表示法加KMP这种相对轻量级的工具来解决。字符串的最大表示可以参考http://blog.youkuaiyun.com/zy691357966/art原创 2015-09-13 22:33:50 · 616 阅读 · 0 评论 -
POJ 1523 SPF (割顶 点双连通分量)
题意就是求出在一个图上去除一个点之后,那个图会变成多少个子连通图。显然我们要求出割顶。我的代码套用了刘汝佳的大白书的tarjan算法,用一个数组cnt[]记录一个点是多少个点双连通分量的割顶。当发现一个点是割顶的时候,就cnt[i]++。最后,如果一个点是一棵dfs树的树根时,就输出cnt[i],否则就输出cnt[i]+1(因为那个点有父亲,而cnt数组记录的相当于是该点的儿子个数)。#i原创 2015-05-16 20:13:12 · 503 阅读 · 0 评论 -
HDU 3394 Railway(点双连通分量的应用)
题意:给定一个无向图,分别求出不在任何环中的边的数量和同时在两个或以上的环中的边的数量。解法:桥上的边就是不在任何环中的。而如果一个点双连通分量中边的数量比点的数量要多,那么该双连通分量的所有边都同时在两个或以上的环中(这个可以想象一下,在一个简单环中多加一条端点不同的边,这样简单环就会被分割成两个小的简单环,任何一条在大的环中的边都会同时处于一个其中一个小的环中)。在tarjan算法中,原创 2015-05-02 22:22:26 · 783 阅读 · 0 评论 -
ZOJ 3862 Intersection (dijkstra)
题意:有一个机器人和n个点,机器人从一个点只能走到与那个点距离小于等于r的另外一个点,而且机器人从一个角度转到另外一个角度的用时等于角度之差。求从第一个点走到第n个点的最短用时。比较容易想到用dijkstra算法。需要用到一个二维的vis数组来记录访问情况,表示从一个点到另外一个点的访问情况(而不是一个点被访问一次之后就不能再被访问了)。细节就是注意浮点数的精度问题就行了。不算难题,但挺有意思原创 2015-04-15 21:04:21 · 738 阅读 · 0 评论 -
POJ2796 Feel Good(单调栈)
这题是典型的单调栈的题目。这里说说我对单调栈的理解:单调栈就是在一个栈里面维持单调的性质,即单调增或者单调递减。如果是单调增的话,准备入栈的元素和栈顶作比较,如果大于栈顶,就入栈;否则就将栈顶元素退栈,在用新的栈顶元素和入栈元素比较,直到入栈元素大于栈顶元素。这道题就是求出一个数在一个最大的区间内使得该数是区间内最小。所以需要求出每一个数所能扩展区间的右端点和左端点。单调栈就是用来原创 2014-07-11 17:31:24 · 739 阅读 · 0 评论 -
POJ 1742
转载自:http://www.hankcs.com/program/cpp/poj-1742-coins.html转载 2014-08-16 17:26:35 · 539 阅读 · 0 评论 -
HDU 5014(Number Squence)
这道题一开始没有什么想法。后来队友找到了一些规律,试验了一下,发现规律成立,然后就AC了。我们的做法是由n开始从大到小遍历,每到一个数w,就找出比它小的二次方数h(就是h=2^k),然后找到w关于h对称的数,进行组合,并且将组合过的数用vis数组标记一下,下一次遍历到的时候就不再操作。而二次方数h就和h-1进行组合。0如果没有被组合过,就是0和0组合。原创 2014-09-14 19:29:02 · 548 阅读 · 0 评论 -
ZOJ 2526(最短路+优先队列)
题意:求出一个图的最短路的数量,原创 2014-09-26 22:51:16 · 680 阅读 · 0 评论 -
hdu 5090
由于数据量较小,可以用暴力解决。原创 2014-11-02 19:18:32 · 1085 阅读 · 0 评论 -
URAL 1471(lca tarjan算法)
题意:给定一棵树,查询时给定两个点,求出两个点的距离。暴力做肯定超时的。我的做法是采用lca(最近公共祖先)的离线算法,即tarjan算法(据说Tarjan提出了很多算法,可能还有很多tarjan算法),算法里用到了并查集。在输入完所有查询之后,在求出答案。tarjan算法的做法是:一开始vis数组初始化为0,从树根开始递归往下对点进行染色,刚到一个点的时候将vis取为-1,在继续递归原创 2015-01-23 21:56:14 · 737 阅读 · 0 评论 -
UVA Live Archive的一个坑点
在UVa Live Archive OJ上面做题的时候,如果你不小心交了一份会死循环的代码,OJ不会像其他OJ一样判定为TLE ,而是会过很长时间之后才判定为submission error。如果你不清楚这个,可能就会在上面浪费很多时间却不知道为什么总是submission error。在多次遇到submission error之后,可以检查一下代码中可能会出现死循环的地方了。原创 2015-03-26 18:38:18 · 799 阅读 · 0 评论 -
hdu 5188 (zhx and contest)
题意:zhx在比赛的时候有n道题目,第i道题目有一个分值vi,需要ti时间做完,而且必须在li或li之后完成。问zhx在获得至少w分数的情况下需要的最少时间。做法:类似于01背包的做法,第i题可以选择做或者不做。先对题目按照li-ti(即第i道题最早的开始时间)从小到大进行排序。然后遍历,在此过程中维护一个top值,top指的是完成前I题之后尽可能迟的时间值。对于第i道题,li-ti到top的原创 2015-03-17 22:06:15 · 731 阅读 · 0 评论 -
hdu 2430 Beans 单调队列
#include#include#include#include#include#include#include#includeusing namespace std;//题意:从num[1]~num[n]中取一段连续的序列,使得(num[i]+...+num[j])%p<=k且该序列的和最大化//令ma=a%mod,mb=b%mod,如果ma<mb,那么(a-b)%mod的值原创 2015-04-02 00:34:26 · 695 阅读 · 0 评论 -
POJ 2570
我在Codeforces上做过一道类似的题目,当时是纯DFS暴力解决的。做这题时以为还是一样,结果TLE了。然后用floyd来做,但是我是用三维数组的方式的conj[i][j][k]代表i和j直接边都是k是否为一条通路。结果还是TLE,看其他人的题解,发现竟然是二进制。conj[i][j]代表i和j之间的状态,状态中二进制的第k位为1的话代表i和j之间存在一条所有边都是k的通路。其实我一开始的做法原创 2015-04-06 23:19:08 · 715 阅读 · 0 评论 -
HDU 3488 HDU3435 HDU 1853 (最小费用流或者最大完美匹配)
这三道题都基本差不多:给定一个图,让每一个点都在一个环中,并且使得这些环的权值之和最小。这类型的题目有至少两种做法:最小费用流或者最大完美匹配。但是具体选择哪一种要结合具体的数据量范围。最大完美匹配的时间复杂度是O(n^3),最小费用流的时间复杂度是O(F*E*log*V),F是做最短路的次数。最小费用流的做法:建图方式是,将一个点拆成两个,编号为i,i+n,对于一条边(u,v,val),原创 2015-09-18 16:32:49 · 766 阅读 · 1 评论