knowledge
文章平均质量分 80
pouy94
艰苦奋斗
展开
-
【后缀数组】字符串万能钥匙
<br />在这之前我对串的全部认识就是kmp一家,应该说这次学习后缀数组总算是让我对串这种东西有了个基本的认识吧。<br />之前有听说过后缀树和后缀数组,感觉上跟线段树树状数组的关系差不多,不过貌似后缀数组的应用范围也很广吧<br />好了,进入正题<br />后缀数组,顾名思义,就是由一些后缀组成的数组,这些后缀就是原串中以i开头的后缀<br />但单是这么个数组没用,我们要使他有一些性质才有用,怎么做呢?排序?<br />没错,就是排序,可以感性地想想,如果对这些后缀按字典序排序,是不是排完序后相邻原创 2010-08-03 16:44:00 · 645 阅读 · 0 评论 -
【POJ1739、travel、画圈圈】连通性状态压缩DP
其实这所谓连通性状态压缩dp并不麻烦,有模板可循算法流程1. 预处理出所有有效状态,这个有效状态的定义是所有括号是配对的,即括号序列合法,并给每个状态一个唯一对应的哈希值(3进制),我用0表示无插头,1表示左插头,-1表示右插头2. 预处理出所有转移,形如g[i,j,k],表示轮廓线的状态为i,转折点为j,第k号转移到哪个状态(编号,不记哈希值)。一般是以下几种转移(但对于每个特定的格子只有两种转移)0 0 –> 0 0 or 1 -1 空格不管或在空格新建两个插头0 1 –>原创 2011-03-15 11:13:00 · 815 阅读 · 0 评论 -
【POI08 PER】模意义下的的除法
取模这种东西到底还是好,将广大OIER从高精度的深渊中解放出来但是,取模也不总是那么方便的比方说,我们的操作中不可避免地出现了除法大部分时候题目会告诉我们取模的数是质数,或者至少除数和取模的数互质,这样我们就能用欧拉定理来解决这个问题了然而,不幸的事终还是发生了这道题所要求的取模的数就是任意的~~题目本身不难,从后往前按位统计+树状数组即可,但由于可重排列公式中不可避免地出现了除法,怎么办?盾哥从这个题的标程中抠出了下面这个不太优美的方法先将要取模的数分解质因数,然后每次要乘或要除一个数的时候,就将那个数的原创 2011-03-20 17:49:00 · 439 阅读 · 0 评论 -
【SHOI2008 堵塞的交通】线段树维护条状网格图的连通性
<br />题意很简洁,这里就不复述了<br />这题其实是WC最短路的超级简化版,方法类似<br />大概就是用一个线段树维护一个区间的左端点到右端点的连通情况,这个信息显然是可以合并的<br />由于只有两层,所以我维护了如下几个信息<br />左上-左下<br />右上-右下<br />左上-右上<br />左上-右下<br />左下-右上<br />左下-右下<br />的连通性<br />修改的时候直接改就可以了,至于询问,由于我们维护的是仅在当前区间走的信息,而最终的路径可能跨区间,所以询问(l原创 2011-05-11 22:57:00 · 1363 阅读 · 0 评论 -
【O(1)空间求出两个出现奇数次的数】搞笑题
<br />题目很简单,要求你用O(1)空间求出一个序列中两个出现奇数次的数(其他数都出现偶数次)<br />另外还有,输入将给出这个序列两遍<br />提示:解法用到了xor的性质和分类的思想<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。。<br />。原创 2011-05-12 19:28:00 · 724 阅读 · 0 评论 -
【MT原创题 丘比特的烦恼】Hopcroft-Karp算法、tarjan
<br />题目H8OJ上有,这里就不罗嗦了<br />题目不难,简单讲一下解法<br />先求个最大匹配,再把无向边定向,匹配边由x集->y集,非匹配边由y集->x集,这样定向了之后,任意一条从x集出发y集结束的路径就对应了一条增广路<br />求出这个图的强连通分量,如果一条边的两个端点处于同一个分量内,那这条边其实没什么影响力,删了这条边原图仍然存在完备匹配<br />而如果这条边的两个端点不在一个分量内,那这条边如果是匹配边那就一定会被选,如果不是匹配边那就一定不会被选<br />可是,由于这个题的原创 2011-05-15 23:07:00 · 845 阅读 · 0 评论 -
【圆的面积并】O(n^2logn)的解法
<br />题解完全参考的AekdyCoin牛、lishi牛和盾哥的题解,具体方法见这些人的文章,这里不罗嗦了<br />这里记几个值得一提的细节<br />1.叉积求面积记得除以2,还有扇形面积公式S = r^2 * p / 2,p是圆心角(弧度),刚好也要除以2<br />2.判好两个圆完全相同的情况,我用的是一个标记数组表示i有没有曾经被包含过,这个包含的意义是要取等号的,也就是说两个完全相同的圆,出现在前面的那个会被判为被包含,后面那个则不会<br />3.当区间跨极角的边界时,我的做法是拆成两个区原创 2011-05-16 22:38:00 · 665 阅读 · 0 评论 -
【HNOI 2008 明明的烦恼】树的prufer编码
<br />有一种叫树的prufer编码的神奇东西能将一棵点带标号的树一一对应地映射成一个长度为N-2的序列,方法如下:<br />每次取出未被删除的标号最小的度为1的点,将这个点相邻的那个点加入序列,同时删除这个点,直到整棵树只剩两个点<br />还原的话,只要从前往后扫这个序列a,将a[i]与序列a中i之后没出现的标号最小的且没被标记过点相连,同时将那个点标记一下,直到最后剩两个没标记的点,将他们相连即可<br />这个编码方法也顺便解释了n个点的树有n^(n-2)个<br />回到这道题,一个点的度数原创 2011-03-30 21:20:00 · 1703 阅读 · 1 评论 -
【两个双连通分量和O(nlogn)~O(logn)在线求LCA的tarjan算法】
小囧了一下,双连通分量有两种我是前两天才知道的相关概念参考byv牛的blog,这里记几个关键的点桥就是dfn[i] 割点就是它发出去的边(i, j)中至少一条满足dfn[i] 我一般求的是所谓 边双连通分量,实际上就是把桥去掉之后还在一起的点的集合而这里还有一个 点双连通分量,这个东西实际上就是差不多把割点去掉之后还在一起的边的集合ps:点 边,这个东西为什么不反过来叫呢?求法的话差不多,都是用tarjan算法,不过求边双连通分量时还要开一个边的栈,碰到一条满足dfn[i] 还有一个东西就是那个求LCA的原创 2011-05-22 22:19:00 · 963 阅读 · 2 评论 -
【集训队试题 礼物】数论、递归求值
题目见H8OJ 2142http://www.zybbs.org/JudgeOnline/problem.php?id=2142综合性比较强的求值题(这个名字好像不怎么样。。)my solution:本题有几个关键点,主要都是基于mod的快速求值a. 列出目标式:b. 将p分解质因数p =(ai为质数)(共t个质因子)c. 加速如下形式的式子的求值S = K! mod (ai^bi) (a为质数)即对p的t个质因子分别求值目标式中在分子的阶乘式直接乘,在分母的则取其原创 2011-04-10 20:15:00 · 383 阅读 · 0 评论 -
【集训队试题 排队】线段树套平衡树
即使我第一个线段树套平衡树,也是一个比朴素还慢的树套树,不解释了{$inline+} program syj; const maxn=20005; var z,nn,m,n,i,j,k,k1,k2,k3,ans,x,y,ll,rr,tt:longint; a,b,c,s:array[0..maxn]of longint; aux,l,r,son,p:array[0..32*maxn]of longint; rt:array[0..4*maxn]of longint; p原创 2011-04-10 22:38:00 · 846 阅读 · 0 评论 -
【搞笑算法小合集】单纯形、模拟退火、FFT
<br />小小地记一下CTSC酱油赛可能得到的一些搞笑算法,提交答案题可以拿来乱搞一下<br /> <br />单纯形:<br />这是用来搞线性规划的一种神器,因为很多东西归约之后都可以用线性规划做,所以这个算法应用面还是比较广的吧<br />具体做法参考算导吧,讲的非常详细<br />这里记一些我的理解<br /><br />核心操作是pivot(i, j)表示用j方程中i变量作为换出变量,j方程的松弛变量作为换入变量对所有方程“消一次”。<br />代码如下:<br />procedure pivo原创 2011-04-30 16:26:00 · 686 阅读 · 1 评论 -
【一句话小结各种网络流】
最大流:DINIC or SAP最小费用最大流:SPFA+增广(费用的值较离散) or ZKW(费用的值集中)有源汇的上下界最大流:新建s', t',用(i, j, l, r)表示i到j有一条下界为l上界为r的边,将每条这样的边拆成(s', j, 0, l), (i, t', 0原创 2011-07-23 21:00:28 · 2133 阅读 · 3 评论 -
【FFT快速傅里叶变换】除草
前几天的SRM和一个ACM比赛居然都很坑爹的考了FFT,现在的题目还真是想怎么出就怎么出啊。 于是就参考算导研究了一下FFT,发现无论是思想还是实现都挺简单的,就只要用一些个复数的定理来用O(nlogn)的时间完成DFT,然后再用一个非常诡异的定理把DFT弄成逆DFT,然后就可原创 2011-09-17 09:51:55 · 662 阅读 · 0 评论 -
【POI06 TET】二维线段树
<br />终于知道二维线段树怎么写了!<br />想来也有点好笑,我搞了这么久OI居然连二维线段树都不会写~<br />以前一直因为这个二维线段树的标记怎么放没搞得清就一直搁着没写,这才终于了却这一“心结”<br />这个题要求在二维线段树上支持两个操作<br />1:将一个子矩阵修改成某个值<br />2:询问某个子矩阵的最大值<br />整个矩阵中的值都是单调非降的,也就是说可以用一种不用下放标记的线段树写法来处理一维的情况<br />一维的情况:<br />线段树上的每个结点记录两个值<br />c原创 2011-03-15 10:49:00 · 1761 阅读 · 0 评论 -
【POJ2104 离线求区间K大数】划分树
<br />区间k大数怎么看都是一个比较重口味的东西,一不小心就要树套树,麻烦的代码,繁琐的调试,考场上性价比非常低<br />于是这个问题就一直搁置在这里<br />突然,划分树的亮相让人眼前一亮,优美的性质,漂亮的复杂度,简洁的代码,怎么看怎么好<br />好了,进入正题。<br />这个划分树的核心还是利用归并的思想,预处理出所有归并的中间结果,和s[i,j],第i层前j个进入左子树的元素个数,有了这个,就在每层都可以O(1)的判断当前区间k大数进入了左子树还是右子树<br />总的时间复杂度是预处理原创 2011-01-11 08:48:00 · 512 阅读 · 0 评论 -
【费用流的一点改进】距离标号连续增广路费用流算法
其实标题中那个又长又霸气的名字只是用来唬人的,其实这个算法非常简单zkw算法的重点其实就是引入了一个距离标号,让程序一边更新标号求最短路,一边增广,从而使速度大幅提高可是zkw算法中每次调整标号只增广一次,感觉有点浪费,为什么不多次增广呢?如果说这个标号让增广的步伐加快了的话,那多路增广就能加大增广的步子,一步多跨一点,也就能让速度更快一点具体实现的话,可以像dinic一样,每次增广时找到一个最靠前的满流边,退到那个地方,继续做代码量并没有大多少,速度却可以飙升实测发现,可能卡到zkw的稠密图一般卡不到这种原创 2010-11-07 15:52:00 · 878 阅读 · 0 评论 -
【pku3691+pku2778】ac自动机 动态规划
再讲题目之前,先讲讲ac自动机吧看到ac这么吉利的东西,学会这什么ac自动机的欲望便来了ac自动机全名Aho-Corasick automation,挺长的,但经验告诉我们,名字越长往往编出来的代码越短,所以不要被这么虎的名字给唬住了好了,进入正题ac自动机就是用来进行多串模式匹配的一种算法(不是一种什么神奇的数据结构),它差不多就等于trie+kmp这个算法的思想非常简单,就在字母树上弄个next指针(相当于kmp中的next函数),然后对于每一篇文章我们就可以根据这棵字母树来O(len)的得到那些单词出原创 2010-08-12 00:16:00 · 806 阅读 · 1 评论 -
【pku2451+3525+3384+1755】半平面交O(nlogn)
<br />又来到了十分弱势的计算几何上,手中对付几何题的武器又多了一把<br />本人对牛书上那个N^2算法不感冒,便直接学习这个高级点的算法(集训队朱泽园论文)<br />略读一遍,英文太多十分之碍眼,加之论文讲的又不太清楚,所以一度陷入迷惘<br />磨蹭了良久,无意中翻见一标程,竟然就是一个简单的双端队列,豁然开朗,遂速切出此模板<br />好了,结束废话,进入正题<br />算法思想非常简单,把直线按极角排序之后,在顺序扫描的过程中求出可行域,整个过程有点类似于凸包那个扫描法<br />实现的时候原创 2010-08-31 00:20:00 · 1124 阅读 · 1 评论 -
【pku3237】动态树
<br />好久没搞麻烦数据结构了,因此借此题练练手,顺便巩固巩固这神奇的动态树<br />题目大意很简洁,就是要求你设计一个数据结构,支持3种操作:<br />改一个边的边权,把i到j的路径上所有边取反,询问i到j的路径上的最大值<br />题目很简洁,思路自然也简洁了,就动态树强做嘛!<br />但实现的时候,还是有一些技巧的,比方说取反,其实只要把i到根取反,再把j到根取反,自然就是把i到j取反了<br />这里我发现要对i到j的路径进行操作,有通法,如下:<br />先ACCESS(I);再ACCE原创 2010-09-25 10:52:00 · 394 阅读 · 0 评论 -
【pku2676+pku3074+pku3076】数独——dancing links
<br />终于搞出个dancing links啦,跳舞庆祝。。<br />先简单讲讲dancing links,大概就是处理一大类覆盖问题的神法。<br />这个算法处理的是一个叫做精确覆盖的模型,意思大概就是给你个01矩阵,要求你选出若干行,使得每列有且仅有一个1<br />不同于别的搜索,dancing links是搜每一列去被哪个行来覆盖,用一个双向十字链表来将所有的1链起来,从而达到去除冗余操作,提升运行速度的神奇效果,疗效显著,3盒一个疗程。。<br />好了,刚才有一点废话,进入正题。(那个d原创 2010-09-25 21:09:00 · 1380 阅读 · 0 评论 -
【pku3666】左偏树的应用、维护区间中位数
<br />先说明,不是所有区间中位数都可以用左偏树维护的,本题是有特殊性的<br />拿到这道题,相信大部分人都想到了n^2的dp,我一开始也是笨笨地编了那个裸裸的程序,结果怎么都得200ms+<br />瞬间就有被第一版的0ms暴虐的感觉,忽然发现discuss里惊现某神牛的3字帖:左偏树<br />这才想到05hhy论文里ms提到了这个题,而且事实上那道题n的范围达到了100000!<br />哈哈,爽一把<br />好了,进入正题,简单讲讲这个高级算法<br />其实本题的解法是贪心,把整个序列分成原创 2010-10-14 14:01:00 · 861 阅读 · 1 评论 -
【HNOI2009 有趣的数列】卡特兰数、筛选法
<br />首先可以通过推算或是打表发现题目就是卡特兰数<br />如果知道要求什么了,甚至差不多要搞出来了,却离ac就差那么一点点,是相当郁闷的,不是吗?<br />一个大问题接踵而来,如何求卡特兰数第1000000项?<br />有个组合公式ans=C(N,2N)-C(N-1,2N)<br />直接分解质因数? TLE?!(MDT打了个质数表+常数优化然后0.7sAC了~囧)<br />更高级的方法? <br />LY想出了一个O(n*(1+1/2+1/3+1/4+...+1/n))的算法:<br />原创 2010-10-25 21:17:00 · 938 阅读 · 0 评论 -
【任意维空间内最接近点对问题】随机旋转坐标系法、期望O(n)
<br />本来2维平面内的最接近点对问题是有O(nlogn)的算法的,但那个分治算法实用性不强<br />盾盾想到了一个十分飘逸的算法:<br /> 随机旋一下系,按x排序然后直接裸找+break即可<br />通常情况下直接按x排序裸找是会被某些数据卡到的(某些无聊的同学就不要说按y排之类的话了)<br />但是,为什么会被卡到?无非就是点全排在一排上就break不动了嘛!<br />那我们随机旋系不就随便数据怎么搞都不容易被卡到了吧!<br />因此该算法有O(快排+k*n)的复杂度,实际测试中该原创 2010-10-26 16:03:00 · 609 阅读 · 0 评论 -
【排序+归并+数据结构】统计类数据结构题的法宝——离线统计满足3个限制条件的信息
就先用一道题来做个引子吧:你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:命令参数限制内容1 x y A1将格子x,y里的数字加上A2 x1 y1 x2 y211输出x1 y1 x2 y2这个矩形内的数字和其中,n题目很恶心难道要动用传说中的动态二维线段树?!真用个像树套树或是什么动态二维线段树之类的神级数据结构还是不太漂亮怎么样才能漂亮地完成这种麻烦的统计呢?说到漂亮,诸如归并排序,树状数组之类的东西就不免从脑中闪现题解寥寥数语,使用归并的思想,先递归完成l~mid原创 2010-10-26 21:29:00 · 595 阅读 · 0 评论 -
【NOI2008志愿者招募 WC2007剪刀石头布 POI2002滑雪者】网络流总结
<br />先讲讲这几道题的题解和心得:<br /> <br />1.志愿者招募:<br /> 题意:见原题<br /> 根据流量平衡方程来构图非常方便,而且简单易懂,以后可能成为做网络流的神法之一<br /> 简单记一下流量平衡方程构图法的步骤:<br /> a.列出需求不等式<br /> b.通过设置松弛变量,将不等式变成等式<br /> c.两两相减,得到流量平衡方程<br /> d.观察方程,>0表示得到的流量,<0表示输出的流量,如果是跟需求量有原创 2010-10-28 17:35:00 · 2176 阅读 · 0 评论 -
【wc2007剪刀石头布】最小费用最大流
<br />用的是我和盾盾研究出来的“距离标号连续最短增广路算法”,实测效果极佳<br />先贴代码,下次再解释<br />program syj; const maxn=105; maxm=maxn*(maxn-1)>>1; oo=maxlongint>>1; var e,s,t,n,m,nn,ans,i,j,x:longint; ok:boolean; h,d,b,sl:array[0..maxm+maxn]of longint; next,point,w,c:array[-(m原创 2010-10-29 20:57:00 · 749 阅读 · 0 评论 -
【NOI2009诗人小G】动态规划、1D1D经典优化
<br />本题其实是个大裸题<br />f[i]=max{f[j]+w(j,i)}的方程基本上是摆明了的,这个方程显然是O(n^2),虽然有30s的时限,但也是过不了的<br />优化,势在必行<br />这个方程最麻烦的一点就在于w(j,i)的形式过于飘逸,连p次方都来了,以至于诸如斜率优化,单调队列等一般方法在这里用不上<br />那怎么办?只剩神法决策单调性了,这个方程有决策单调性吗?怎么证? p.s 决策单调性就是对于i<j,i的最优决策<=j的最优决策<br />本人数学不才,但可以隐约感觉到应原创 2010-10-29 21:21:00 · 1212 阅读 · 0 评论 -
【HNOI 2009图同构计数】Pólya计数法的应用
不好意思地说,我拿到这道题时,第一个就把波利亚这条路排除了,囧组合数学无能力者syj是也不过这道题确实非常好,需要扎实的数学功底和精妙的模型转化技巧,而这正是我所欠缺的题目大意:n个点的图,要你求本质不同的图的个数,说两个图本质相同是指存在一组点的标号方法,使得边完全相同思路: 首先我们要往波利亚上面想,想办法构造置换群,从容易分析的点的置换推到同构本质的边的置换,再统计答案。 然而,本题n!的置换群个数逼得我们换一个角度思考 如果考虑总方案数有难度,不妨想想每个点事件会被算到多少次,统计所谓的原创 2010-11-06 21:29:00 · 1543 阅读 · 1 评论 -
【集训题 糖果分发、集装箱】一类特殊动态规划的优化方法
<br />先拿一道题(糖果分发)做引子(by Ly)<br />大意:给你n个物品,每个物品有个重量,你可以取m次,每次取出的物品重量之和不超过一个给定的数k,而且每次你只能在一段区间内选择,每次选的区间不能相交,求最多能取到的物品数。需要注意的是,题目中要求你在“一段区间内”取,但并不要求你取走这个区间内的所有物品<br />数据范围:1<=n<=2000,1<=m<=50,1<=k<=10000<br />分析:<br /> 算法显然是dp,首先容易得到一个O(n*m*k)的方程,但显然是过不了的原创 2010-11-06 22:34:00 · 354 阅读 · 0 评论 -
Linux系统下得到更精确的时间
不知道各位童鞋在Linux系统中写对拍有没有出现过困扰, 一般我写初始化随机化种子都用srand(time(0)); 然而在Linux系统下time函数返回的时间只能精确到秒,这也就意味着我们每秒最多只能拍一组数据,而这在很多题目中是不太够的。 怎么在Linux系统下得到更为精确的系统时间呢? LYP告诉了我一种方法,可以精确到微秒。 #include int main() {原创 2011-11-02 22:03:06 · 475 阅读 · 0 评论