上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 25 下一页
摘要: 在网上总是查不到很系统的练ACM需要学习的数据结构资料,于是参考看过的东西,自己整理了一份。能力有限,欢迎大家指正补充。分类主要参考《算法竞赛入门经典训练指南》(刘汝佳),山东大学数据结构模板⊙基本数据结构1.链表:块状链表:没练过Dancing Links:用于优化搜索。解决精确覆盖问题和重复覆盖问题的利器。Knuth教授的始祖论文:Dancing Links中文版Dancing Links介绍(这篇对DLX的工作过程演示的很详细)DLX——Dancing Links(这篇对精确覆盖与重复覆盖解释的简洁清晰)------------------------------------------ 阅读全文
posted @ 2013-07-28 11:13 冰鸮 阅读(480) 评论(0) 推荐(0)
摘要: 两次DFS求树直径方法见 这里。这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分。K R: ans = R − 1 + ( K − R ) ∗ 2; 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int MAXN = 100010; 9 10 struct node 11 { 12 int v; 13 int next; 14 }; 15 16 int N, Q, EdgeN; 17 int head... 阅读全文
posted @ 2013-07-27 23:25 冰鸮 阅读(299) 评论(0) 推荐(0)
摘要: 一个比较经典的题型,两次DFS求树上每个点的最远端距离。参考这里:http://hi.baidu.com/oi_pkqs90/item/914e951c41e7d0ccbf904252dp[i][0]表示最远端在以 i 为根的子树中的最长长度,dp[i][1]记录最远端在以i为根的子树中的次长长度,dp[i][2]表示最远端不在以 i 为根的子树中的最长长度。答案即为max( dp[i][0], dp[i][2] );dp[i][0]和dp[i][1]可以通过一次DFS得到。再看dp[i][2], 设fa[i]为节点 i 的父节点: dp[i][2] = max( dp[ fa[i] ][2] 阅读全文
posted @ 2013-07-27 21:51 冰鸮 阅读(342) 评论(0) 推荐(0)
摘要: 扩展欧几里得的应用……见算法竞赛入门经典p.179注意两点:1.解不等式的时候除负数变号2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 && b=0 && c!=0 ) ( a=0 && b!=0 )( a!=0 && b=0 )能加深对扩展欧几里得的理解,不错的一题 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 #define LL long long int 8 9 using namespac 阅读全文
posted @ 2013-07-27 11:54 冰鸮 阅读(229) 评论(0) 推荐(0)
摘要: 来源:http://wenku.baidu.com/view/9d2d5781d4d8d15abe234e35.html我是用到什么就敲什么,敲好了就放在这里备用#include #include #include #include #include using namespace std;const double EPS = 1e-9;const int MAXN = 40;struct Point3 //空间点{ double x, y, z; Point3( double x=0, double y=0, double z=0 ): x(x), y(y), z(z) { }... 阅读全文
posted @ 2013-07-26 19:20 冰鸮 阅读(576) 评论(0) 推荐(0)
摘要: 题意:给你一些无限长的圆柱,知道圆柱轴心直线(根据他给的三个点确定的平面求法向量即可)与半径,判断是否有圆柱相交。如果没有,输出柱面最小距离。一共只有30个圆柱,直接暴力一下就行。判相交/相切:空间直线距离是否小于等于两圆柱半径和若无相交,求最小:空间直线距离-两圆柱半径和 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const double EPS = 1e-9; 10 const int MAXN = 40; 11 12 struct... 阅读全文
posted @ 2013-07-26 19:16 冰鸮 阅读(335) 评论(0) 推荐(0)
摘要: 感觉不是很好写的一道状态压缩。dp[i][j][k]表示第 i 行状态为k,第i - 1行状态为 j,具体细节见代码。内存卡的很死,要用滚动数组。还有一个比较坑爹的地方是它在输入蛋糕的时候中间可能会出现空行,一开始我用getchar()读,连第一组数据都过不去,后来改成scanf( "%s", str )才过……错了好多次。 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int MAXN = 520; 9 const int INF = 1 0 && 阅读全文
posted @ 2013-07-26 16:20 冰鸮 阅读(428) 评论(0) 推荐(0)
摘要: 相当于从n-1个位置里面找k-1个位置放隔板 1 #include 2 #include 3 #include 4 #include 5 6 #define LL long long int 7 8 using namespace std; 9 10 int main()11 {12 double n, k;13 int T;14 scanf( "%d", &T );15 while ( T-- )16 {17 scanf( "%lf%lf", &n, &k );18 if ( n - k < k - 1 ) ... 阅读全文
posted @ 2013-07-26 11:43 冰鸮 阅读(202) 评论(0) 推荐(0)
摘要: 离散化的时候,排序后相邻点差值大于1的话需要加点。 1 #include 2 #include 3 #include 4 #include 5 6 #define lson l, m, rt > 1; 45 build(lson); 46 build(rson); 47 return; 48 } 49 50 void Update( int L, int R, int c, int l, int r, int rt ) 51 { 52 if ( L > 1; 59 if ( L m ) Update( L ,R, c, rson... 阅读全文
posted @ 2013-07-26 11:10 冰鸮 阅读(218) 评论(0) 推荐(0)
摘要: 500ms时限406ms水过……直接枚举肯定超时,需要剪枝。枚举每个格子的元素,检查其左上角和正上方格子是否满足条件,若不满足不必再向下搜索。在 这里看到一个更好的方法:枚举每个格子是哪个相邻的比它大。然后DFS看看有没有环。这样的复杂度只有(2^5*3^5)。不过我没写出来……而且也不太清楚这个时间复杂度是怎么算的……求指点! 1 #include 2 #include 3 #include 4 5 const int dx[] = { -1, 1, 0, 0 }; 6 const int dy[] = { 0, 0, -1, 1 }; 7 8 int N; 9 ... 阅读全文
posted @ 2013-07-25 20:42 冰鸮 阅读(369) 评论(0) 推荐(0)
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 25 下一页