摘要: 题意:有一个1到n的一个被打乱的排列,告诉你每个数的左边有多少个数比它小,显然第一个数左边没有比它小的数,求每个位置上的数。分析:用树状数组可以求出某一个序列中所有左边小于等于array[]的个数。这个题正好相反,已知每个数左边小于它的个数,求这个序列。用树状数组也可以做,但是没有线段树好理解。线段树中num记录[l,r]中还剩余多少人尚未被确定代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 const 阅读全文
posted @ 2012-08-17 20:20 pushing my way 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一堆坐标点,求小于每一个坐标的坐标个数。分析:这个题显然也不能遍历,数据太大,会超时。从poj2299,知道树状数组可以用来求一个排列中array[i]前面小于等于array[i]的个数。例如array[i]= 9 1 0 5 4通过树状数组可以知道:array[1]=9--->1 即坐标小于等于1中比9小的个数为1.array[4]=5--->3 即坐标小于等于4中比5小的个数为3.具体怎么求呢?2299中也说过,构建树状数组时要将array[]进行排列,然后对对应的number号进行处理,即:1.要求原来顺序 9 1 0 5 4,前面小于等于array[i]的个数,先 阅读全文
posted @ 2012-08-17 11:36 pushing my way 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 题意:求逆序对。分析:以前用分治的思想写的,这次用树状数组。以array[]=9 1 0 5 4 为例,1.对于每个array[i],求出小于等于array[i]的个数:9:11:10:15:34:3个这里如果遍历求的话,就超时了。因此需要构建树状数组,树状数组需要离散化。有:array[] 9 1 0 5 4num1 2 3 4 5这里不压缩要1--n内有时也行,如果数据小的话。比如这个例子就行,离散到大于等于1就行。但是如果数据大的话,就得压缩压下。2.用树状数组求小于等于array[i]的个数应该以array[]由小到大排序遍历i 1 2 3 4 5array 0 1 4 5 9num 阅读全文
posted @ 2012-08-17 09:37 pushing my way 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 题意:把一个完全图分成两部分,使得连接这两部分边的权和最大。分析:图论的无向完全图的最大割问题可以用 随机化算法 Random Algorithm 去做。参考http://blog.csdn.net/lyy289065406/article/details/6648571代码:View Code 1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 //#include <time.h> 5 #include <stdlib.h> 6 using name 阅读全文
posted @ 2012-08-16 15:49 pushing my way 阅读(1208) 评论(0) 推荐(0) 编辑
摘要: KMP算法的预处理时间为最坏情况下O(m),匹配时间是O(n),这里重点掌握模式P的前缀函数:next:{0,1,2,...,m-1}--->{-1,0,...,m-2} 满足 next[q]=max{k;k<q && pk+1后缀于pq}其中pk+1是模式的前k+1个字符,pq是模式的前q个字符,next[q]是pq的真后缀,P的最长前缀的长度。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <string> 4 using namespace 阅读全文
posted @ 2012-08-16 10:30 pushing my way 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 题意:给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的子串有多少种。分析:1.这个题不用匹配,因为不高效。2.将长度为n的子串看作n位的nc进制数,将问题转化为共有多少种十进制数字。3.哈希时,每一个字符都对应这0---nc-1的一个数字。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 const int maxnum=1600000; 6 char str[maxnum 阅读全文
posted @ 2012-08-15 12:38 pushing my way 阅读(1009) 评论(0) 推荐(0) 编辑
摘要: 字符串匹配算法有四种:1.朴素算法,预处理O(0),匹配时间O((n-m+1)m) 其中n是文本长度,m是模式长度2.Rabin-Karp算法,预处理O(m),匹配时间同朴素算法3.有限自动机算法,预处理O(m|∑|),匹配时间O(n)4.KMP算法,预处理O(m),匹配时间O(n)这里讨论的是有限自动机算法,先给出预处理为O(m^3|∑|),匹配时间为O(n)的算法。代码:View Code 1 #include <iostream> 2 #include <string> 3 #include <stdio.h> 4 using namespace st 阅读全文
posted @ 2012-08-15 11:00 pushing my way 阅读(664) 评论(0) 推荐(0) 编辑
摘要: 题意:双核电脑上有N个模块,可以在核A或核B上运行,运行时间不同.此外有M组数据(u,v,w)表示从模块u与模块v之间传输,如果模块u和模块v在同一个核心里运行,则传输不需要时间,否则需w时间,求用最少时间使这N个模块在电脑上运行,并完成数据传输.分析:一开始真的不知道使用网络流。看到分配成两部分的题,就要想到网络流最小割的问题。最小割.建图:N个模块当作N个点,从源点到这N个点,容量为在A核运行时间,再连一汇点,容量为在B核运行时间,另外,M组数据传输(u,v,w),连u->v(w),v->u(w);dinic+邻接表。TLE了。这是为什么呢?以后还得考虑啊。View Code 阅读全文
posted @ 2012-08-14 12:01 pushing my way 阅读(564) 评论(0) 推荐(0) 编辑
摘要: dinic算法是网络流最大流的优化算法之一,每一步对原图进行分层,然后用DFS求增广路。时间复杂度是O(n^2*m)(n是点数,m是边数)层次图:把原图中的点按照到源的距离分“层”,只保留不同层之间的边的图。算法流程:1、根据残量网络计算层次图。2、在层次图中使用DFS进行增广直到不存在增广路。3、重复以上步骤直到无法增广。时间复杂度:因为在Dinic的执行过程中,每次重新分层,汇点所在的层次是严格递增的,而n个点的层次图最多有n层,所以最多重新分层n次。在同一个层次图中,因为每条增广路都有一个瓶颈,而两次增广的瓶颈不可能相同,所以增广路最多m条。搜索每一条增广路时,前进和回溯都最多n次,所以 阅读全文
posted @ 2012-08-13 19:12 pushing my way 阅读(495) 评论(0) 推荐(0) 编辑
摘要: 题意:给的就是n个虫子 m对虫子发生过关系 然后问有没有虫子是同性恋。分析:题目等价为,n个点,m条边,能否仅用两种颜色染完所有点,并使每条边的两个点不同色。bfs,遍历每个顶点,如果相邻顶点染有相同的颜色,说明有同性恋!代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 #include <queue> 5 using namespace std; 6 const int maxnum=2001; 7 bool array[maxnum] 阅读全文
posted @ 2012-08-12 12:35 pushing my way 阅读(298) 评论(0) 推荐(0) 编辑