|
|
|
|
|
摘要:
维护一个单调栈,栈中元素单调递减。同时记录一个num数组,表示的是栈中这个点能够看到的牛的数量+1(它本身)插入元素a[i]时,一直dec(stack_size)直到stack[stack_size]>=a[i],同时temp记录扫过的num[i]之和,在ans的值上加上temp值如果stack[stack_size]=a[i],那么就在num[stack_size]上加上temp+1,否则将这个元素压入栈中。最后的ans值就是答案CODEProgram Badhair;//By_ThispoetConst maxn=80000;Var i,n,size,temp :Longint... 阅读全文
posted @ 2011-09-16 23:40
This_poet
阅读(585)
推荐(0)
编辑
摘要:
O(n^4)+强力剪枝优化无压力,不用二分图匹配的麻烦构图。搜索策略:枚举对角线——因为只有枚举对角线才能保证正方形唯一。剪枝:1、对于每个是'J'的点,枚举出它非严格下方的所有'J'点,不用全部枚举N^4次2、对于每条对角线,计算出其中点tx、ty坐标与两个端点x、y坐标的差值x1,y1,x2,y2,如果tx+y1或ty+x2不是整数就判断下一个。判断条件:对于每条合法对角线,满足((map[tx+y1,ty+x2]='J')and(map[tx+y2,ty+x1]<>'B'))or((map[tx+y2,ty+x1 阅读全文
posted @ 2011-09-16 23:26
This_poet
阅读(994)
推荐(0)
编辑
摘要:
思想与合并果子相同。逆序地来想,显然这些板子必须一共切割n-1次,如何恰当的分配这n-1次切割就是关键所在。这里就用到了构造Huffman树的贪心思想。即每次从待合并序列中取两个最小的值,将它们合并成一个较大的,然后把这个较大的在加入进待合并的序列当中,直到待合并序列中只有一个元素。而不加任何优化时复杂度为O(n^2),难以承受。可以用堆将复杂度优化到O(nlogn),就完全可以接受了。CODEProgram plank;//By_ThispoetConst maxn=20000;Var i,j,k,m,n,heap_size :Longint; ans :Int6... 阅读全文
posted @ 2011-09-16 07:39
This_poet
阅读(882)
推荐(0)
编辑
摘要:
改进过后的匈牙利算法即可轻松秒掉最大流的各种NB算法。不过,这种方法有一个局限,就是右边集合可以匹配多个而左边集合只能匹配一个的时候才可以用,否则只能搞神马SAP等等了。匈牙利算法的改进:1、存储右边集合的结果时不要只存一个,而是将所有匹配结果都存下来。2、在找增广路时,把(res[k]=0)的条件改成(res[k,0]<max[k])CODEProgram Stead;//By_ThispoetConst maxn=1000;Var pre,other,last :Array[1..maxn*20]of Longint; res :Array[1..20,0.... 阅读全文
posted @ 2011-09-15 20:00
This_poet
阅读(465)
推荐(0)
编辑
摘要:
以前不会想,也不会写。现在会写了,也大概想明白了。后缀数组,真是个麻烦的东西。题目大意如下:给定一个长度在5000以内的字符串,求出出现过两次或两次以上的最长字串(保证唯一解)。不多说了,裸的后缀数组:Program Suffix;//By_ThispoetConst maxn=10000;Var i,j,k,m,n,p,q,ans,pos,sum :Longint; rank,sa,a,x,y :Array[1..maxn]of Longint; st :Ansistring;Procedure Qsort(l,r:Longint);var i,j,k,p,t... 阅读全文
posted @ 2011-09-15 17:54
This_poet
阅读(1208)
推荐(0)
编辑
摘要:
这道题精在判重优化。因为如果存在两个数A、B,且满足A mod n=B mod n=C,那么,这两种情况可以看做是重复的,保留较小数即可。具体优化,开一个布尔数组即可。特别需要注意一点:如果n=0,那么应当输出0!!!{本弱就因为这个WA了半天,看Discuss才明白的……}CODEProgram Multiple;//By_ThispoetConst maxn=20000;Var h,t,j,k,m,n,i :Longint; seq,fa,mol :Array[1..maxn]of Integer; a :Array[1..maxn]of Longint; fg ... 阅读全文
posted @ 2011-09-14 19:31
This_poet
阅读(685)
推荐(1)
编辑
摘要:
声明:这是本菜在学习二分图相关知识的时候神小花儿推荐的课件中的知识。现在整理上来和大家分享。二分图相关问题:二分图定义及判定二分图最大匹配二分图最小覆盖二分图最大独立集二分图最小路径覆盖二分图最优匹配稳定婚姻问题一、定义及判定:定义:二分图中,顶点可以分为两个集合X和Y,每一条边的两个顶点都分别位于X和Y集合中判定:利用BFS或者DFS进行黑白染色,共享一边的两点异色,检查是否存在矛盾图G为二分图的充要条件是图中不含奇环二、二分图最大匹配定义:匹配是二分图中边的集合,且集合中的任意两条边没有公共点,包含边数最多的匹配就是最大匹配匈牙利算法:1、概念:交错路对于一个匹配M,如果能找到一条奇数长度 阅读全文
posted @ 2011-09-14 16:54
This_poet
阅读(2070)
推荐(0)
编辑
摘要:
二分图最小覆盖:找到一个点集,使得每条边上至少有一个点在该集合中。证明二分图最小覆盖=二分图最大匹配:二分图最大匹配后,每个点都不能找到增广路,而找不到增广路的原因就是至少有一个点已经被匹配了。即这个点在二分图的最大匹配中。而二分图最大匹配中会存在同一条边两个点都在这个点集中的情况,我们只要取一个点即可。本题当中,将机器A上的模式看作X集合,机器B上的模式看作Y集合,每个任务对应一条边,两点分别为在A,B上的模式,建立二分图。可以看出,最小的重新启动次数就是二分图的最小覆盖——即最大匹配。普通匈牙利算法即可。Hint:注意一点:读入时要加上这样一句话,否则会WA:if p*q=0 then c 阅读全文
posted @ 2011-09-14 09:06
This_poet
阅读(555)
推荐(0)
编辑
摘要:
这道题还是很有意思的。题目大意如下:给定一个模式串,如果在主串中存在这样一个子串:子串长度与模式串长度相同,且子串中各个数字的大、小、同关系和模式串中的大、小、同关系是一样的,就称该子串满足条件。比如说模式串:1,4,4,2,3,1 而主串:5,6,2,10,10,7,3,2,9那么主串第三位开始的2,10,10,7,3,2就是满足条件的具体的算法很巧妙:我们对于每一个模式串中的数字要进行预处理,处理的方法很简单:分别找出三个数字作为它的定位数字:1、前面离它最近的比它小的最大的数字的编号2、前面离它最近但不是它本身的和它相同的数字的编号3、前面离它最近的比它大的最小的数字的编号有了这三个定位 阅读全文
posted @ 2011-09-14 07:53
This_poet
阅读(2145)
推荐(0)
编辑
摘要:
建议大家学一学比较巧妙的KMP算法吧,很有意思。推荐个题目:POJ3167 Cow Patterns 题解我会发在本博里。这个KMP就木有什么好说的了吧,大家找百度百科学一下就可以了~CODEProgram KMP;//By_ThispoetConst maxn=1000005;Var st,s :Ansistring;//st is long and s is short pre :Array[-1..maxn]of Longint; i,k,p,q,ans,n :Longint; BEGIN readln(n); while n>0 do begin ... 阅读全文
posted @ 2011-09-14 07:42
This_poet
阅读(441)
推荐(0)
编辑
|
|