
Algorithm
文章平均质量分 60
那闯
这个作者很懒,什么都没留下…
展开
-
Google Code Jam2008 Round1B Number Sets(并查集)
#include #include using namespace std;bool primes[1000001];int primesV[1000001];int priSize;int sets[1000001];void GetPrimes() { int i; priSize = 0; memset(primes, true, sizeof(primes))原创 2013-03-18 12:22:08 · 949 阅读 · 0 评论 -
快速Crc32附录
快速Crc32实现:http://blog.youkuaiyun.com/edwardvsnc/article/details/8901438用汇编写了一个FastCrc32,比用_mm_crc32_u32慢了1倍。代码:inline uint32_t MyFastCRC32(char *src, uint32_t len) { static uint32_t re = 0xfffff原创 2013-05-17 11:54:08 · 3657 阅读 · 0 评论 -
图论 LCA离线算法 Tarjan
Least Common Ancestors:对于一棵树求A,B两点的最小公共祖先。从根节点DFS,在回溯时将当前点加入集合,如搜索到A时判断B是否已在集合中,如B已在集合中则合集中最浅的结点为A,B的最小公共祖先;如B不在集合中,则继续搜索B。离线算法Tarjan:在O(n + q)时间内,一次性计算出所有请求的LCA,但结果是无序的,得到结果的次序与请求发出的次序不相同。(n 为结点数原创 2013-05-22 15:23:02 · 1095 阅读 · 0 评论 -
图论 LCA在线算法 倍增法
Lowest Common Ancestor:如求A,B两点的LCA,先计算出各个结点的深度depth[],然后,通过递推公式求出各个结点的2次方倍的祖先ancestor[],假设depth[A] > depth[B],则找到depth[ancestor[A][i]] == depth[B]也就是A的某一祖先与B深度相同,然后,u = ancestor[A][i],通过ancestor[u][原创 2013-05-22 17:30:36 · 2965 阅读 · 2 评论 -
图论 最短路 Dijkstra
Dijkstra :单源最短路,不允许有负权。执行过程:以某一源点开始(源点在集合内)找出与其连通的最近结点,并加入集合,然后松弛集合外的所有点,继续找与源点最近的集合外的点,加入集合,循环这个过程,直到所有点都进入集合为止。如果某点未在集合内,则该点与原点不连通。模板:#define NODE_SIZE 100#define INFINITE_INT 0x0fffffff原创 2013-05-13 11:37:02 · 1013 阅读 · 0 评论 -
图论 拓扑排序
Topological Sort:如果图是有回路的,就不可能存在拓扑排序后的线性序列。一个图的拓扑排序可以看成是图中所有顶点沿水平线排列而成的一个序列,使得所有的有向边均从左指向右。时间复杂度: O(V+E) 模板:#define NODE_SIZE 500#define EDGE_SIZE (NODE_SIZE*NODE_SIZE)struct Edge { i原创 2013-05-16 14:56:32 · 904 阅读 · 0 评论 -
图论 欧拉回路
欧拉回路/欧拉路:通过图G中每条边仅一次的一个回路(回到原点)。性质1: 无向图为欧拉回路,当且仅当图上的每个点度数都是偶数。性质2: 有向图为欧拉回路,当且仅当图上的每个点入度等于出度。半欧拉回路/欧拉路径:每一条边仅走一次,不需要回到原点。推论1:无向图为半欧拉图,当且仅当两顶点度数为奇数,其它点度都为偶数,且图连通。推论2:有向图为半欧拉图,当且仅当一个顶点入度比原创 2013-05-28 19:33:04 · 1330 阅读 · 0 评论 -
Hadoop v2(Yarn)中的快速Crc32
测试源码:下面的代码是从Hadoop 2.0.3中PureJavaCrc32C.java中取出来的:A pure-java implementation of the CRC32 checksum that usesthe CRC32-C polynomial, the same polynomial used by iSCSIand implemented on many Int原创 2013-05-13 11:07:00 · 2271 阅读 · 0 评论 -
非比较排序
计数排序(Counting-Sort):基本思想: 确定比某一元素x小的元素的个数n,则排序后x所在的位置为n+1。#define COUNTING_SIZE 100void CountingSort(int *dat, int len) { const size_t arr_len = len; int *cnt = new int[COUNTING_SIZE];原创 2013-06-24 07:17:21 · 918 阅读 · 0 评论 -
树状数组
1.数组公式: S[i] = d[i - 2^k + 1] + d[i - 2^(k - 1) + 1] .... + d[i] *k表示i的二进制形式从右起直到第一个1为止0的个数。 比如(168)10 = (10101000)2 则 k = 3 (11)10 = (1011)2 则k = 02.求2^k: 2^k = (i & i ^ (i -原创 2013-10-07 16:32:27 · 719 阅读 · 0 评论 -
DP(2) 状态压缩
例子:炮兵阵地 问题描述:在一个n*m的图中排放士兵,每一个士兵的攻击范围是横竖2个单元格,也就是一个宽高都为3的十字型,任何一个士兵都不允许站在其他士兵的攻击范围之内;另外,地图上‘H’表示山也不允许放置士兵,问最多可以放置多少个兵士。详细描述:http://poj.org/problem?id=1185状态转移方程:dp[i][s1][s2]=max(dp[i-1][s2][s3]原创 2013-06-26 06:48:04 · 963 阅读 · 0 评论 -
图论 强连通 Kosaraju
Kosaraju:执行过程:在有向图G中,从A进行一次DFS(From A,To B),然后再对GT(G的逆向图)进行一次DFS(From A, To B),如果两次DFS都成功,则说明两次DFS所重复经过的点,都在同一个强连通分量上。原创 2013-11-07 01:50:03 · 828 阅读 · 0 评论 -
NOI 国家集训队论文集
转载链接:http://blog.youkuaiyun.com/bright_xl/article/details/11084747国家集训队论文分类组合数学计数与统计2001 - 符文杰:《Pólya原理及其应用》2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》2007 - 周冬:《生成树的计数及其应用》2008 - 陈瑜希《Pólya计数法的应用》数位问题转载 2013-11-13 16:36:38 · 1379 阅读 · 0 评论 -
图论 次小生成树
次小生成树#includeusing namespace std;#define NS 110#define INF 0x7fffffffint n , m;int map[NS][NS];bool visited[NS];int dis[NS] , elen;int _pre[NS];struct Edge { int u , v;}edge[NS];void Ini原创 2013-12-27 09:58:35 · 925 阅读 · 0 评论 -
数论 基础
中国剩余定理:例如,要找出一个数,除3余1,除5余4,除7余3,求这个数最小是多少。1. 求35*n%3=1,则n最小为2,35*min=70;求15*n%7=1,15*min=15;求21*n%5=1,21*min=21。2. 根据定理 如果a%x=b,则(a*k)%x=b*k,得70*1 + 15*3 + 21*4等于199。3. 得3,5,7的最小公倍数为105,用199除原创 2013-04-15 15:52:56 · 761 阅读 · 0 评论 -
DP 01背包 hdu 2602
#includeusing namespace std;#define M 1001#define WMAX( a , b ) a > b ? a : bint f[M] , w[M] , v[M];int main(){ int n , mv; int t , i , j; scanf( "%d" , &t ); while( t-- ) { s原创 2011-04-08 18:50:00 · 1081 阅读 · 0 评论 -
DP 完全背包 hdu 1114
#includeusing namespace std;#define M 501#define INF 0x7fffffffstruct Node{ int w , p;}nod[M];int dp[10001];int main(){ int t , n; int w , wt , pt; int i , j; scanf( "%d" ,原创 2011-04-08 18:37:00 · 717 阅读 · 0 评论 -
数论 MillerRabin hdu 3792
#include#includeusing namespace std;int p[10002];int ans[2002];int len;__int64 ModExp( __int64 a , __int64 b , __int64 n ){ __int64 m = 1; while( b ) { if( b & 1 )原创 2011-03-14 08:53:00 · 1004 阅读 · 0 评论 -
KMP hdu 1711
#includeusing namespace std;#define M 10000#define N 1000000int m , n;int str[N];int cmp[M] , next[M];void InitNext(){ int j , k; next[0] = -1; j = -1; k = 0; while( k {原创 2011-03-16 12:57:00 · 739 阅读 · 0 评论 -
大数加法
Template:void AddBigUint(const char *pA, const char *pB, char *pSum) { int lenA = strlen(pA); int lenB = strlen(pB); int lenSum = 0; int lenBig = lenA > lenB ? lenA : lenB;原创 2013-07-10 19:17:36 · 997 阅读 · 0 评论