
数据结构
文章平均质量分 73
Non_Cease
这个作者很懒,什么都没留下…
展开
-
线段树 + 反素数 poj2886
关于反素数:摘自此博客:http://magicode.blog.sohu.com/120450550.html这个题主要用到线段树的思想,每次推算出要出去的人在当前剩下的人中的排位,再用线段树求出其原来的编号,即可算出每次应该出去的人,该人得到的糖果数为f(p)(p为出去的顺序,f(p)为p约数的个数其实当总人数n确定时,p的值和f(p)的值就确定了,p为小于等于n的最大反素原创 2011-12-17 19:45:26 · 1166 阅读 · 0 评论 -
线段树(单点更新)poj2828
题意:输入n个有序对 pi表示在第pi个位置后面插入一个值为vi的人,并且pi是不降的。输出最终得到的v的序列。线段树,记录区间内的空位置数,反过来将人插入到序列中。#include #include using namespace std;#define N 200005//spare存储区间内的空位置数int spare[N << 2], seq[N];void原创 2011-12-14 15:05:36 · 2488 阅读 · 1 评论 -
poj2002 hash
建立一张hash表,将所有的顶点加入该表枚举正方形相邻两个顶点,求出另外两个顶点的坐标,判断这两个顶点是否在hash表中。#include #include using namespace std;#define TABLE_SIZE 2003int p[1005][2];struct Node { int x, y; Node *next;} t原创 2012-02-23 21:36:49 · 955 阅读 · 0 评论 -
poj2503 简单的hash
用闭散列,平方探测用hash函数求出外语字符串的地址,存放到table中。对需要翻译的单词,到table中查找即可。#include #include #include using namespace std;#define TABLE_SIZE 200003struct Node { char key[12], fore[12]; bool flag;原创 2012-02-24 21:22:16 · 1052 阅读 · 0 评论 -
poj 3468 树状数组解法
转自:http://kenby.iteye.com/blog/962159一 算法 树状数组天生用来动态维护数组前缀和,其特点是每次更新一个元素的值,查询只能查数组的前缀和,但这个题目求的是某一区间的数组和,而且要支持批量更新某一区间内元素的值,怎么办呢?实际上,还是可以把问题转化为求数组的前缀和。 首先,看更新操作update(s, t, d)把转载 2012-04-07 14:14:03 · 2254 阅读 · 0 评论 -
poj3468 树状数组(区间更新)
此题详解参见:poj 3468 树状数组解法此篇写下自己之前不是很理解的地方。#include #include #include using namespace std;#define MAXN 100005__int64 initSum[MAXN];__int64 t1[MAXN], t2[MAXN];inline __int64 lowbit(__int6原创 2012-04-07 15:01:10 · 2689 阅读 · 0 评论 -
poj3067 树状数组求逆序数
题意:日本岛东海岸与西海岸分别有N和M个城市,现在修高速公路连接东西海岸的城市,求交点个数。做法:记每条告诉公路为(x,y), 即东岸的第x个城市与西岸的第y个城市修一条路。当两条路有交点时, 满足(x1-x2)*(y1-y2) 上面说的可能有点难理解,详细说明如下。 记第i条边的端点分别为xi,yi。原创 2012-04-08 13:14:53 · 913 阅读 · 0 评论 -
poj2750 线段树+动态规划
问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和。出题者的简单解题报告:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;否则,答案是:max{根结点的非空最大子列,环上数的总和-根结点的非空最小子列},每次问答的复杂度是O(logN)。原创 2012-04-08 14:34:37 · 2356 阅读 · 0 评论 -
poj2528 线段树+离散化
题意:n(n 求出最后还能看见多少张海报。输入:151 42 68 103 47 10解法:离散化,如下面的例子(题目的样例),因为单位1是一个单位长度,将下面的 1 2 3 4 6 7 8 10 — — — — — — — — 1 2 3 4 5 6原创 2012-03-22 22:32:10 · 11181 阅读 · 13 评论 -
poj1330 LCA离线算法
模版参考:http://blog.youkuaiyun.com/non_cease/article/details/7426395题目:给定一棵树,求两个结点的最近公共祖先。(最基础的LCA问题)#include #include #include using namespace std;const int maxn = 10006;int dp[maxn][15], father[m原创 2012-04-14 13:23:18 · 986 阅读 · 0 评论 -
poj3667 线段树(区间合并)
题意:有编号为1~n的n个房间,有两种询问 1.有人来订连续的k间房,有的话返回第一间房的编号,否则返回0。 2.有人退连续的从a开始的连续的k间房。解法:与之前做过的poj2750(线段树+动态规划)类似,就是在线段树上,记录每个区间的3个信息 1.该区间最大的连续空房数 2.该区间从最左边起的最大的原创 2012-04-25 16:50:47 · 860 阅读 · 0 评论 -
线段树 hdu2795
题意:一块h*w的广告牌,现在n个人往上面放广告,广告大小为1*wi,每个人都希望自己的广告尽量靠左上方。输出每个广告在第几行,若不能放进去就输出-1。/*广告牌从上往下的行数逐渐增大。将每一行看成一个叶子节点,例第r行为区间[r,r]这个叶子节点。maxw[i, j]存储第i到j行空闲的最大宽度。*/#include #include using namespace std原创 2011-12-14 15:25:47 · 497 阅读 · 0 评论 -
线段树求逆序数 hdu1394
贴代码,重要的地方有详细注释。#include #include using namespace std;#define N 5005int sum[N << 2]; //记录区间线段内的点数void pushUp(int rt){ sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int原创 2011-12-13 17:15:59 · 2439 阅读 · 0 评论 -
线段树 成段更新 hdu1698
题意:该表屠夫某一段钩子的价值,n次改变,最后输出总价值。#include #include using namespace std;#define N 100005int sum[N << 2], col[N << 2];inline void pushUp(int rt){ sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}原创 2011-12-18 22:00:13 · 711 阅读 · 0 评论 -
线段树(成段更新 关于延迟标记) poj3468
延迟标记:当我们在对某个节点rt进行更新时,先不向其子节点更新(如果向其子节点更新,更新到叶子节点,那么更新操作的时间复杂度就达到了O(n)), 当我们要用到该节点的后裔的时候,再将该延迟标记向下移动,这样更新操作就仍为O(logn)的时间复杂度。#include #include using namespace std;#define N 1原创 2011-12-18 21:46:38 · 3514 阅读 · 0 评论 -
poj3349 散列表
开始用分离链接法实现的散列表,结果超时,于是改成了开放定址法实现的散列表,还是超时于是把输入输出改成了c的写法,结果都过了。。。//分离链接法散列 3485ms#include #include using namespace std;#define TAB_SIZ 14997#define SIDE 6struct ListNode{ int a[SIDE]; st原创 2011-07-27 14:35:14 · 887 阅读 · 0 评论 -
广义表建树
简单的广义表建树,但是却纠结了几个小时,总之是太囧了。。。代码还很糟糕。。。不过也记录一下,或许以后还是用得上。殷人昆数据结构 5.37 题代码:#include using namespace std;#define ADD 5struct treeNode{ char val; treeNode * son, * next;};bool isLette原创 2011-11-23 21:06:30 · 2101 阅读 · 1 评论 -
线段树 hdu1166 (敌兵布阵)
开始学习线段树,这是线段树的第一道题。看了这位神牛的代码,然后理解了一遍,然后自己敲了一遍(几乎完全一样)。http://www.notonlysuccess.com/index.php/segment-tree-complete/#include #include using namespace std;#define MAXN 50005int sum[MAXN原创 2011-12-11 21:53:15 · 605 阅读 · 0 评论 -
POJ3087 hash
这道题看别人用模拟做代码短,时间也快,我用hash做,纯粹只是为了练习,hash的确是不熟,还得多练练。//47ms#include using namespace std;#define SIZE 102#define TAB_SIZ 14997int size;struct ListNode{ char s[2*SIZE]; struct ListNode *next原创 2011-08-21 20:29:09 · 477 阅读 · 0 评论 -
poj3274 hash
怎么hash网上已经说得很清楚,我就不多说了。我看的这个博客: http://hi.baidu.com/aconly/blog/item/9d1ed1122a29af876538db0b.html直接贴一下我的代码, 也有一些我做的过程中遇到的问题:#include #include #include using namespace std;#define K 33#d原创 2011-11-29 12:48:44 · 702 阅读 · 0 评论 -
poj1840 map + hash
题意:输入五个范围在-50~50的系数,求一个五元三次方程有多少组解,解的范围也是-50~50。做法:遍历方程的前两项,将值存到hash表中,再遍历后三项,看得到的值的相反数是否在hash表中。我用map hash,效率较低。#include #include using namespace std;typedef map M_TYPE;const int n =原创 2011-11-30 14:59:47 · 1584 阅读 · 0 评论 -
斐波那契查找(数据结构)
殷人昆《数据结构》第二版的7.25题#include #include #include using namespace std;#define MOD 50#define SIZE 13int fib_search(int x, int n, int fib[], int ar[]){ int k = 2, l = 1, r = n, mid, offset =原创 2011-12-10 09:08:19 · 1196 阅读 · 0 评论 -
线段树(单点更新)hdu1754
题意:老师询问被编号为1~n的学生中的某个区间内学生的最高分。 老师也可以更新某个学生的分数。#include #include using namespace std;#define N 200005#define M 2005int maxsc[N << 2]; //存储区间内的最高分数。inline int MAX(int a, int b)原创 2011-12-13 17:27:24 · 636 阅读 · 0 评论 -
poj2255 根据二叉树的前序和中序遍历 求出树的后序遍历
http://poj.org/problem?id=2255前序遍历的第一个字符为树的根节点;找到根节点字符在中序遍历中的位置,则该位置的左边的字符串为左子树的中序遍历串,右边为右子树中序遍历串;根节点在中序遍历首位,无左子树根节点在中序遍历末位,无右子树#include #include #include using namespace std;const int原创 2013-02-28 19:51:57 · 2905 阅读 · 0 评论