摘要: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3633给你n个数,然后m个询问,每次询问区间[a,b]中从右到左最先出现重复的数字,比如51 2 3 1 2询问[1 5],那么答案就是2.因为2是第一次出现2次的。其中3≤ n ≤ 500,000,1 ≤ m ≤ 50,000,数值<=2^31-1。解法是,先把所有数字从小到大排序,相同的按出现的先后顺序排序。更新时,对于每一个数x,如果前面的y==x的话,那么在线段树中,在x的坐标位置上赋值上y的坐标位置。查询时,[a,b]就是查询区间[a,b]中大于等于a的最 阅读全文
posted @ 2012-08-26 20:09 Accept 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 首先了解一点,求解一个数的因子个数。假设p[]数组里全部是素数,那么任何一个整数,可以唯一的表示成n=p1^x1*p2^x2*p3^x3.......*pm^xm,那么因子个数便为:(x1+1)*(x2+1)*.....*(xm+1)。给定一个整数n,求解1~~n范围内,因子个数最多的那个数,如果相同的话,取较小的。这里要认识到一点,因子数最多的那个数,根据我们上面说的,可以由素数的乘积组成。那么我们枚举素数的幂,也就是上面式子上的x1,x2,x3...xm。就可以遍历到1~~n范围内的所有可能解。假设n的取值范围是10^18次方,看起来很大是吧,对于素数2来说,2^60次方就大于10^18次 阅读全文
posted @ 2012-08-14 20:30 Accept 阅读(526) 评论(0) 推荐(0) 编辑
摘要: http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1423Description:由于山体滑坡,DK被困在了地下蜘蛛王国迷宫。为了抢在DH之前来到TFT,DK必须尽快走出此迷宫。此迷宫仅有一个出口,而由于大BOSS的力量减弱影响到了DK,使DK的记忆力严重下降,他甚至无法记得他上一步做了什么。所以他只能每次等概率随机的选取一个方向走。当然他不会选取周围有障碍的地方走。如DK周围只有两处空地,则每个都有1/2的概率。现在要求他平均要走多少步可以走出此迷宫。Input:先是一行两个整数N, M(1<=N, M<=10)表示迷宫为N*M大小,然 阅读全文
posted @ 2012-08-09 14:01 Accept 阅读(1846) 评论(0) 推荐(1) 编辑
摘要: 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i]的形式,其中f[j]中保存了只与j相关的量。这样的DP方程我们可以用单调队列进行优化,从而使得O(n^2)的复杂度降到O(n)。可是并不是所有的方程都可以转化成上面的形式,举个例子:dp[i]=dp[j]+(x[i]-x[j])*(x[i]-x[j])。如果把右边的乘法化开的话,会得到x[i]*x[j]的项。这就没办法使得f[j]里只存在于j相关的量了。于是上面的单调队列优化方法就不好使了。这里学习一种新的优化方法,叫做斜率优化,其实和凸包差不多,下面会解释。举例子说明是最好的!HDU 3507,很适合的一个入门题。http://a 阅读全文
posted @ 2012-08-03 11:56 Accept 阅读(37272) 评论(28) 推荐(23) 编辑
摘要: 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减。队首位置保存的是最优解,第二个位置保存的是次优解,ect。。。单调队列可以有两个操作:1、插入一个新的元素,该元素从队尾开始向队首进行搜索,找到合适的位置插入之,如果该位置原本有元素,则替换它。2、在过程中从队首删除不符合当前要求的元素。单调队列实现起来可简单,可复杂。简单的一个数组,一个head,一个tail指针就搞定。复杂的用双向链表实现。用处:1、保存最优解,次优解,ect。2、利用单调队列对dp方程进行优化,可将O(n)复杂度降至O(1)。也就是说,将原本会超时的N维dp降优化至N-1维,以求通过。这也是我想记录的重点是不是任 阅读全文
posted @ 2012-07-11 11:25 Accept 阅读(13878) 评论(4) 推荐(8) 编辑
摘要: 分五步!第一,修改CXXX类的定义,让其从CObject派生,即在XXX.h文件中将CXXX的定义改为:class CXXX :public CObject第二,重载Serialize函数,在XXX.h中增加该函数的声明:void Serialize(CArchive &ar);并在XXX.cpp中实现这个函数,void CGraph::Serialize(CArchive &ar){ if(ar.IsStoring()) { // add your codes } else { // add your codes }} 第三,在声明XXX类时,用DECLARE_SERIAL宏 阅读全文
posted @ 2012-04-18 20:25 Accept 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 关于求多边形内核的算法什么是多边形的内核?它是平面简单多边形的核是该多边形内部的一个点集,该点集中任意一点与多边形边界上一点的连线都处于这个多边形内部。就是一个在一个房子里面放一个摄像 头,能将所有的地方监视到的放摄像头的地点的集合即为多边形的核。如上图,第一个图是有内核的,比如那个黑点,而第二个图就不存在内核了,无论点在哪里,总有地区是看不到的。那么,如何求得这个内核区间呢?通常的算法是用两点的直线去不断切割多边形,切割到最后剩下的,就是内核区间了。我们都知道一条直线可以将平面切割成两个区域,假设直线方程为ax+by+c==0,那么,两个平面可分别表示成ax+by+c>=0 和 ax+ 阅读全文
posted @ 2012-01-20 21:32 Accept 阅读(4194) 评论(0) 推荐(2) 编辑
摘要: http://poj.org/problem?id=2886恩,分糖果,快乐的童年啊!题目意思大概n个小孩围成一个圈,每个小孩手里有张卡片,记录着一个数字。开始从第k个孩子,该孩子离开圈子,然后告诉别人他手里的数字,接下来便从位于该孩子的位置加上孩子手中的数字的孩子开始,直到所有的孩子都离开了圈子,游戏便结束。每个跳出圈子的孩子都能得到一定的糖果,数目是他跳出圈子的顺序数的因子数之和。 例如第6个跳出的孩子能得到(1,2,3,6)四个糖果。这个游戏,其实和猴子选大王是一样的!只要注意好求解相对位置即可,所谓相对位置,例如:a,b,c,d四个人,a对应1,b对应2,c对应3,d对应4.但是当b不 阅读全文
posted @ 2011-11-14 21:12 Accept 阅读(496) 评论(0) 推荐(1) 编辑
摘要: http://poj.org/problem?id=3145Harmony Forever。。。多吹牛B啊。这题巧妙的运用了鸽笼原理,什么是鸽笼原理?鸽笼原理就是给你N+1个数,则必定至少有两个数的余数是相同的!解决这题的时候,我们先用RMQ的方法求出每一段的最小值,这是容易做到的。这题的数据范围是500000,也就是说最多会有500000个叶子节点,当该叶子节点的值为inf的时候,表示这里没有值。当它的值等于它的位置的时候,表示它有值,例如:集合[3,4,5]在线段树中叶子节点中的表示为 [inf,inf,inf,3,4,5],前面三个inf分别表示0位,1位和2位询问的时候,假设我们要求的 阅读全文
posted @ 2011-11-14 20:06 Accept 阅读(376) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2828灰常有趣的一道逆序思维题目,并且题目掐的很死,用链表什么的,统统tle如何逆序思维?假设数据如下:40 771 511 332 69我们从后向前解题,开始是第四个人,他的pos==2,可是他前面分明还有3个人,也就是说,他必须插一个人的队才有可能达到他要达到的位置再看第三个人,他的pos==1,他前面还有两人,他也需要插一个队再看第二个人,他的pos==1,前面也只有一个人,1-1==0,他不需要插队第一个人,0-0==0,也不需要插队了最终队序是:77 33 69 51我们用线段树加快插队速度,如何做?很简单,定义一个left表示该 阅读全文
posted @ 2011-11-14 11:14 Accept 阅读(214) 评论(0) 推荐(0) 编辑