算法设计
文章平均质量分 57
RJxiaowu
这个作者很懒,什么都没留下…
展开
-
hdu3710(树链剖分计算lca)
突然发现剖分树可以在log(n)的时间里求出lca,于是又删了几十行的代码。#include <iostream>#include <stdio.h>#include <vector>#include <algorithm>#include <ctime>using namespace std;const...2011-09-30 00:12:20 · 180 阅读 · 0 评论 -
hdu2825
/*AC自动机,增设虚拟节点,求长度为n的字符串中包含至少k个给出的关键字的字符串的个数,结果模MOD。增设虚拟节点的目的是为了方便状态转移*/#include <cstdio>#include <cstring>using namespace std;const int N= 105; //节点个数的最大值const int S...2011-11-04 11:53:03 · 97 阅读 · 0 评论 -
poj3691(DNA Repair)
/*AC自动机,增设虚拟节点,求长度为n的字符串中包含至少k个给出的关键字的字符串的个数,结果模MOD。增设虚拟节点的目的是为了方便状态转移。dp转移实际上是在安全图上进行的!*/#include <cstdio>#include <cstring>#include <map>using namespace std;co...2011-11-04 13:18:27 · 209 阅读 · 0 评论 -
zoj3228
/* * AC自动机,每个节点 添加一个d表示节点代表的字符串的查询类型1表示只有查询0,2表示只有查询1,3表示有查询 * 0和查询1,len表示该节点代表的字符串的长度。 */#include <cstdio>#include <cstring>#include <map>using namespace std;cons...2011-11-04 16:12:29 · 155 阅读 · 0 评论 -
zoj3190
/* * AC自动机,先对资源串和病毒串构成的字符串集合建立AC自动机,然后在trie树上做BFS求出在安全图上每个资源串 * 到其他资源的最短路径,最后做一遍状态压缩dp即可 */#include <cstdio>#include <cstring>#include <map>using namespace std;con...2011-11-04 17:34:52 · 92 阅读 · 0 评论 -
zoj3545
/*AC自动机相当暴力的 解法:mark[i][j][k]表示长度为i,走到节点j上,目前还有的基因组合为k的状态是否可达,true表示可达,false表示不可达。*/#include <cstdio>#include <cstring>#include <map>using namespace std;const ...2011-11-04 18:18:43 · 93 阅读 · 0 评论 -
zoj3500
求两个球的体积交或者并#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const double pi=acos(-1.);struct point3{ double x, y, z;};struct sph{ point...2011-11-07 17:41:44 · 98 阅读 · 0 评论 -
uva(Transitive Closure)
source: http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=388&problem=3063&mosmsg=Submission+received+with+ID+928527title:Tr...2011-11-08 14:45:35 · 145 阅读 · 0 评论 -
hdu4115
source: http://acm.hdu.edu.cn/showproblem.php?pid=4115 title: Eliminate the Conflict /*题解转自: http://www.haogongju.net/art/759654题解: 题目意思很简单,两个人石头剪刀布,一个人的出法是确定的,另一个人的出法有一定约束,某两次要相同或者不同...2011-11-09 16:27:21 · 132 阅读 · 0 评论 -
hdu4118
枚举每条边最多被经过的次数即可 #include <cstdio>#include <algorithm>#include <iostream>using namespace std;const int N=100005;typedef long long ll;struct e{ int v, len; e* nx...2011-11-09 21:53:11 · 82 阅读 · 0 评论 -
manacher算法
const int LEN=110005;const int N=LEN*2;int p[N];char str[LEN], tmp[N];//p[i]表示以str[i]为中心的回文往右延伸的 最长长度void manacher(char* str, int* p){ int n=strlen(str), i, id, mx; for(p[mx=id=0]=i=1...2011-11-11 00:06:36 · 96 阅读 · 0 评论 -
uva2819
source: http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&page=show_problem&problem=2819 title: Largest Empty Circle on a Segment题目简意:给出n条线段,求圆心在线段(0, 0)-->(L,0)上 的圆...原创 2011-11-13 02:20:00 · 77 阅读 · 0 评论 -
poj3968
source: http://poj.org/problem?id=3968title: Jungle Outpost题目简意:给出一个凸多边形,求至少删除多少个点后,多边形内的任意一点都得不到庇护。/*可以肯定,被移除的 这些点在凸多边形上是连续的,于是可以二分至少需要移除的点数k,然后用ps[i]->ps[(i+mid+1)%n](0<=i<n)构造...2011-11-14 04:45:46 · 121 阅读 · 0 评论 -
hdu3686
/*无向图边的双连通分量,在同一个连通分量里的边之间的路径不会有必须经过的点点和边的下标从1开始。*/#include <cstdio>#include <vector>using namespace std;const int N=10005; //点数const int M=100005; //边数,边的双连通分量的点数是O(M)...2011-11-14 20:43:44 · 165 阅读 · 0 评论 -
hdu3684
/*刚开始打了个记录上下左右四个点的,一直tle。研究了isun大牛的代码后发现原来可以更简单………… */#include <cstdio>#include <algorithm>#include <cmath>using namespace std;typedef double typev;const int N=1...2011-11-15 20:11:46 · 110 阅读 · 0 评论 -
判断单链表是否有环
算法思路: 指针p1和p2的起始值均为链表的表头,指针p1每次走一步,指针p2每次走两步。如果链表存在环,则当p1和p2都进入环时,p2会“追上”p1,因为每次行走,p2和p1的距离都缩短了1. //visual studio 2012 下编译通过#include <stdio.h>struct node{ int val; node* next; ...2013-01-08 19:07:12 · 119 阅读 · 0 评论 -
hdu4095
/*第一步,构建BST,用第一个数作为bst的根,每加进 一个节点u,查询bst中比u小且和u的差的绝对值最小的数rv,如果 rv存在且rv还没有右孩子,则把u作为rv的左孩子,否则,查询bst中比u大且和u的差的绝对值最小的 数字lv,把u作为lv的左孩子。这一步可以用树状数组搞定。时间复杂度是O(n*log(n))。第二步,计算以每个节点u为根的子树往左边延伸的长度...2011-11-03 13:19:50 · 102 阅读 · 0 评论 -
zoj3540
/*其实就是把总共的 放置次数减去不能放置的那些就行了。而不能放置的 那部分是一个个矩形 !所以问题 就转化为举行并的面积了。 */#include <cstdio>#include <algorithm>#include <iostream>using namespace std;const int N = 50005; ...原创 2011-11-02 21:33:23 · 110 阅读 · 0 评论 -
hdu3894
source: http://acm.hdu.edu.cn/showproblem.php?pid=3894title : East and West这道题贪心就可以解决了,首先找到一条把东西部的点分割开的边(est, wst),然后从wst开始bfs,直到找到西部的p个点,并把这p个点到wst的距离放到minp数组里。对于东部里最初有train的点也做类似的操作,但把这...原创 2011-09-30 15:32:58 · 105 阅读 · 0 评论 -
hdu3872
source: http://acm.hdu.edu.cn/showproblem.php?pid=3872title: Dragon Ball解法:线段树这题的题解不太好写。需要利用的一个特点是:设当前扫描到点i,vMax[u]表示[u, i]之间的能量的最大值,则vMax具有不增性。 #include <iostream>#in...2011-10-04 21:20:41 · 121 阅读 · 0 评论 -
hdu4063
O(n^5)的算法求出圆和圆之间的交点,和所有圆的圆心构成图上的点,有O(n+n*n)个,判断两个点之间是否可达的方法是这两个点构成的线段是否都被圆覆盖(求出这个条线段被每个圆覆盖的部分,然后合并起来),每次判断的复杂度是O(n),共有O((n*n+n)*(n*n+n))次判断,所以复杂度高达O(n^5)^-^。代码比较慢就不贴了…………...2011-10-07 19:12:37 · 164 阅读 · 0 评论 -
hdu3950
线段树即可解决这个题。向线段树插入一个车阵的时候,只需要插入车阵的最左边的点p(姑且称这些点为黑点)即可,len[p]记录这个车阵的长度(len数组的作用不仅仅是这些,当p这个位置为空白时,len[p]表示从p位置开始往右的一段空白的长度)。seg结构里的lp,rp,表示区间[l, r]的黑点的位置的最小值和最小值,sum表示黑点的总和。而minPos有点不一样,minPos表示...2011-10-09 21:44:34 · 136 阅读 · 0 评论 -
hdu4067
source: http://acm.hdu.edu.cn/showproblem.php?pid=4067title : Random Maze分析转载自: http://blog.csdn.net/fp_hzq/article/details/6852778#reply分析:说到这题不觉有些肉疼,毕竟比赛的时候构图算是对了,就是没判断a,b的大小,...2011-10-10 21:28:37 · 126 阅读 · 0 评论 -
hdu3662
source: http://acm.hdu.edu.cn/showproblem.php?pid=3662title : 3D Convex Hulleclipse C++ 编译通过 #include <stdio.h>#include <algorithm>#include <cmath>#include <l...2011-10-11 20:28:53 · 90 阅读 · 0 评论 -
做算法题应该要注意的一些问题
1、浮点数的 输出要注意加上一个较小的数字,至于这个数字多小就得视题目的精度而定。1、做几何题,应该选用精度损失最小的方法去做每一步的计算。2、用eclipse写程序,调试的时候一般会把数组开小些,提交之前记得把数组开到题目的要求范围。3、写C++程序 应该要学会用运算符重载,这样可以让代码短很多!特别是几何题 ,点的叉积 ,点积之类的运算都可以用运算符重载实现 。...2011-10-26 12:10:39 · 278 阅读 · 0 评论 -
bupt244
source: http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=244title: A Letter to Programmers /*坐标变换的公式+矩阵快速幂 */#include <iostream>#include &...2011-10-26 12:16:01 · 72 阅读 · 0 评论 -
zoj3203
/*三分法 */#include <cstdio>#include <algorithm>using namespace std;double H, h, D, mid;const double eps = 1e-10;int sign(double a){ return a < -eps ? -1 : (a > ep...原创 2011-10-26 17:08:36 · 95 阅读 · 0 评论 -
hdu3867
/*点光源能够射到的棍子的个数,线段树。线段树的每个节点记录覆盖这段区间的棍子的下标,以及这根 棍子上的 某点到点光源的距离 */#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const int N = 10005;con...原创 2011-10-27 09:46:00 · 140 阅读 · 0 评论 -
hdu3881
source: http://acm.hdu.edu.cn/showproblem.php?pid=3881title : Pirates of the Caribbean题目简述: 给出风的方向 以及若干岛屿,风速和船速一定,求船从 那个岛到哪个岛航行时的速度最大。 /*把向量(kx, ky)旋转到和y轴重合(所有的点也做类似的操作),结果就是求两个点的斜率的 绝对值...2011-10-27 18:47:23 · 103 阅读 · 0 评论 -
hdu3819
/*这个题需要注意的是整体上不单调的,所以不能一开始就用二分法求解,而是先从下往上一段段的判断,直到找到某一段不满足条件了就用二分法。 */#include <cstdio>#include <algorithm>using namespace std;const int N = 105;const double eps = 1e-1...原创 2011-10-27 22:03:35 · 92 阅读 · 0 评论 -
hdu3982
//半平面交+多边形和圆的交的面积#include <cstdio>#include <algorithm>#include <cmath>#include <iostream>using namespace std;const int N = 2050;const double eps = 1e-8;cons...2011-10-29 10:20:47 · 252 阅读 · 0 评论 -
hdu2939
source: http://acm.hdu.edu.cn/showproblem.php?pid=2939title : Campus Recruit /*稳定婚配问题,延迟认可算法 */#include <cstdio>#include <algorithm>using namespace std;typedef pair<...原创 2011-10-29 18:36:29 · 123 阅读 · 0 评论 -
poj1741(树的分治,基于边的 分治)
/* 树基于边的分治算法,计算树中距离小于等于k的点对数目点的下标从1开始,树里实际的节点个数的上界是N*3当点只有一个的时候,得到的是空树(这个需要注意),分治树有O(log(NUM))层,如果会动态改变树里的信息的话,还需要记录每个的节点在每一层是在左子树还是右子树,以及在这一层到根的距离信息(这里的根指的是这一层的分治边的两个点中到该点距离较近的那个点)。...2011-11-02 20:25:02 · 209 阅读 · 0 评论 -
升序数组中求一个key出现的次数
算法思路: 在排好序的数组,相同的数字是排列在一起的,所以只需要找到key的左边界和右边界即可。找左边界可以看成是找数组中第一个大于等于key的数的位置,找右边界可以看成是找最后一个小于等于key的数。复杂度分析:时间复杂度是O(log(n)),空间复杂度是O(n)。 #include <stdio.h>/* * @brief 在升序数组a中找到第一个大于...2013-01-09 23:08:11 · 160 阅读 · 0 评论