高级算法
文章平均质量分 75
apachecq
这个作者很懒,什么都没留下…
展开
-
用线段树求区间分段问题
问题:在X轴上的覆盖n条各种颜色(可以相同)一定长度的线段,问X轴被分成多少个段?分析: 定义cover如下:cover=-1表示该区间由多种颜色组成。cover>=0表示该区间只有一种单一的颜色cover。 插入算法: void insert(int i, int l, int r, int color) //将区间[l,r]的颜色改为color { int原创 2009-01-07 08:17:00 · 569 阅读 · 0 评论 -
DP的一些杂记
1. 最长公共上升序列(LCIS)在做决策时,同时考虑2个条件. P版源程序. program lcis;const maxn=1000;var a,b,num:array[1..maxn] of longint; l1,l2,n,m,t:longint;begin assign(input,in.in); assign(output,out.out);原创 2009-02-05 10:22:00 · 407 阅读 · 1 评论 -
凸包( Convex Hull )
凸包是对平面是上的某个点集而言的,凸包是一个最小凸多边形,满足点集中的所有点都在该凸多边形内(或在该多边形的边上)。通常,我们采用Graham扫描法来求点集的凸包。首先,排序选出点集中最左下角点(先取y坐标最小的点,若有多个再在其中取x坐标最小的点),设该点为p0;然后,将其余的按以p0为中心的极角坐标逆时针排序,多于相同极角的点只保留距离p0最远的一个,这样就可以得到一个点的序列p1,p2, p原创 2009-02-05 17:41:00 · 468 阅读 · 0 评论 -
ACM ICPC学习计划
大牛给的计划——一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上。 下面给个计划你练练: 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Floy转载 2009-01-29 08:13:00 · 1065 阅读 · 2 评论 -
几道非传统题的解答
1. CELL解答:暴力搜索 2. relation 解答:找数学规律,递推式。注意,题目描述中没有给出数据规模,说明可能存在数学公式。 3. 中等工资解答:5个人,问5次,可以把中间那个人的工资确定出来。然后把第6个人来替换中间那个人,就又可以算出来。这样下去,问5*(N-4)次,就可以确定出N-4个人的工资,剩下的4个人(分别是工资最大和最小的两个)无法确定。原创 2009-01-20 09:54:00 · 246 阅读 · 0 评论 -
并查集的简单应用 ZOJ1789 The Suspects
#include using namespace std;const int MAXN = 32768;int P[MAXN], Rank[MAXN], Num[MAXN];int n, m, ans;void Make_Set(int n){ int i; for (i=0; i { P[i] = i; Rank[i] = 0; Num[i] = 1; }}int Find_S原创 2009-01-17 10:09:00 · 285 阅读 · 0 评论 -
POJ分类(初级)
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先转载 2009-01-16 09:56:00 · 2825 阅读 · 0 评论 -
poj 1470 AC得好辛苦
比较简单的LCA。我先用的是邻接表来存放树结构和查询,结果要超时。但程序应该可以在ZOJ上AC。我自己判断超时的原因可能是对于本题的多组数据输入格式,每做完一组数据后,需要对各个数据结构清0,对于动态申请的邻接表结点要逐一释放空间。这些操作对于一组输入数据可能花不了多长时间,但对于多组数据,就会花很长时间。然后我计算了一下空间限制,对于N=900的上限,开两个二维数组来存放树和查询,采用“假指原创 2009-01-13 18:11:00 · 1383 阅读 · 2 评论 -
LCA问题的Tarjan离线算法
利用并查集优越的时空复杂度,我们可以实现LCA问题的O(n+Q)算法,这里Q表示询问的次数。Tarjan算法基于深度优先搜索的框架,对于新搜索到的一个结点,首先创建由这个结点构成的集合,再对当前结点的每一个子树进行搜索,每搜索完一棵子树,则可确定子树内的LCA询问都已解决。其他的LCA询问的结果必然在这个子树之外,这时把子树所形成的集合与当前结点的集合合并,并将当前结点设为这个集合的祖先。之后继续转载 2009-01-11 17:46:00 · 3417 阅读 · 1 评论 -
复习LCA Tarjan算法
PKU 1470 Closest Common Ancestorshttp://acm.pku.edu.cn/JudgeOnline/problem?id=1470解题报告:输入描述的很恐怖,其实用scanf + getchar也可以很简单就写出来,用Tarjan算法要注意,统计祖先的时候要想清楚,不要重复统计和少统计了。比如:21:(1) 22:(0)2(1 2) (2 1)1:2PKU 198转载 2009-01-11 17:36:00 · 1331 阅读 · 0 评论 -
POJ 3264 Balanced Lineup 线段树解法
//用线段树维护区间最大值和最小值。建树复杂性:O(logN), 查询复杂性:O(Q*logN) #include using namespace std;const int MAXN = 50010;int MX[4*MAXN], MI[4*MAXN], A[MAXN];int N, Q;void init(){ int i; scanf("%d%d", &N, &Q);原创 2009-01-11 17:13:00 · 237 阅读 · 0 评论 -
RMQ问题ST算法 POJ 3264
ST算法O(nlogn)预处理,O(1)的查询指定区间的最值(以最小值为例) 基本上是把待求区间[l,r]分为两段长为len的区间 左边一段为[l,l+len-1],右边一段为[r-len+1,r] len必须使得两段区间覆盖待求区间 设所求数组为w 那么,所求最小值就是两个区间的最小值间的最小值 即min(min{w[i],l 若都在预先处理中先求得两个区间的最小值转载 2009-01-08 11:29:00 · 690 阅读 · 0 评论 -
基本的LCA问题的实现
LCA问题可以归约为RMQ问题求解。归约方法为:做一次DFS(Euler Tour),在DFS过程中,记录三个数组的值:E[i]:在Euler Tour过程中途经的结点编号L[i]:在Euler Tour过程中途经的结点的层次(从根结点算起的深度)RMQ问题可以有多种实现方法,本程序采用了Sparse Table方法。//LCA problem.#include #include using na原创 2009-01-10 13:00:00 · 418 阅读 · 0 评论 -
Range Minimum Query and Lowest Common Ancestor
【原文见 http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor】 作者转载 2009-01-08 10:11:00 · 469 阅读 · 0 评论 -
USACO 5.5 PICTURE 题解
首先将纵向的边当作一个个的event。每个Event都记录下这条边的两个端点的纵坐标与这条边的横坐标。然后以x坐标的大小对这些event进行排序。矩形的左纵向边是插入事件,右边是删除事件。 线段树可以在许多数据结构的书上有讲解,这里就不再重复。这里需要两个运算,一个是“测度”,求出线段树上,所有合并以后的长度。一个是求“线段的段数”,就是这个线段树上有几条线段。 算法: 建树转载 2009-02-13 10:43:00 · 473 阅读 · 0 评论