IT民工
加油!
上一页 1 2 3 4 5 6 7 8 9 10 ··· 29 下一页
摘要: 线段树的区间合并,其中lsum代表区间左边最大连续长度,rsum代表区间最大连续长度,msum代表区间最大连续长度。因为本题是查询连续区间的左端点,那么如果左儿子满足条件,就继续查询左儿子,左儿子不满足条件,就判断左儿子的rsum+右儿子的lsum是不是满足条件,最后才查询右儿子。/*Accepted 2236K 594MS C++ 2574B 2012-08-21 12:15:23*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using nam 阅读全文
posted @ 2012-08-22 16:02 找回失去的 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 求区间第k小,划分树,又一种神奇的数据结构。2104也可以用这个代码AC,那道题是裸的求第k小。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;const int MAXN = 100010;struct Node{ int l, r;}T[MAXN << 2];int d[MAXN], s[MAXN], t[21][MAXN], tol[21][MAXN];void build(int level, 阅读全文
posted @ 2012-08-20 16:58 找回失去的 阅读(340) 评论(0) 推荐(0) 编辑
摘要: A大数运算大数模版写得不熟,然后出了不少错误,准备自己写一个模版。G拓展欧几里德求逆元这道题公式没推错,代入参数搞错了,然后一直在调,浪费不少时间。I求线段交点很普通的计算题,WA了6次,最后才A掉,计算时没有考虑double比较大小的细节,手写的fabs没过。今天就A了三道最水的题,比较让我失望,I题不应该错这么多次,细节决定成败,这句话放在哪都没错,因为这样WA掉罚时真的很不值。希望明天比赛顺利,然后进入校队。A:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostre 阅读全文
posted @ 2012-08-09 17:08 找回失去的 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在WA,然后修改下就过了。离散化时将所有的时间点都加入到一个X数组中,经过判重后X的元素有k个,我们就可以建立一个k个元素的线段树。查询和修改时只需找到时间点在X数组中的位置,然后就和普通线段树没有任何区别了,这题不需要从叶子向根节点更新,只需从根到叶子节点更新。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define lson l, 阅读全文
posted @ 2012-08-09 16:10 找回失去的 阅读(436) 评论(0) 推荐(0) 编辑
摘要: 线段树成段更新的基础题,每次操作将x到y这个区间的值改为z,然后最后要求输出的是1到n的区间和,根据线段树的性质,1到n的区间和其实就是sum[1]。/*2012-08-08 16:07:20 Accepted 1698 1015MS 2280K 1407 B G++ Yu*/#include<stdio.h>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 100100;int sum[MAXN << 2], col[MAXN << 阅读全文
posted @ 2012-08-08 16:15 找回失去的 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 食物链是一道经典的并查集题,这道题难在怎么确定两个动物之间的关系。看了罗德安大神的分析,有种豁然开朗的感觉。问题分析:我们把已经确立了关系的动物分到一个群落里,对于每一个提到的两个数字编号, 看它们是否属于同一个群落,如果是的那么根据它们已有的关系,我们作出相应的判断 即可;若它们属于不同的群落,那么根据互相的关系将两个群落合并;若恰有一个没有 加入到任意一个群落之中,那么将这一个并入另一个的群中即可;若两个都未加入任意 群中,那么我们新建一个群即可。基本思路:这一题的难点在于记录动物之间的关系,即ABC三种动物是循环被吃的,我们用 0,1,2表示,记录在rank[i]中,如果i吃j,则让.. 阅读全文
posted @ 2012-08-08 15:25 找回失去的 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 线段树的一个应用,求逆序数。思路为:sum[i]为0代表i未出现,为1则已经出现,然后查询时我们只要统计新加入的数到n-1这个范围内有多少个sum[i]为1,也就是当前数的逆序,然后累加,就是我们要求的逆序数。因为其他形式都可以由第一次求得的逆序数递推而来,所以只需计算一次。/*2012-08-07 16:54:38 Accepted 1394 78MS 252K 1478 B G++ Yu*/#include<stdio.h>#include<algorithm>using namespace std;#define lson l, m, rt ... 阅读全文
posted @ 2012-08-07 17:02 找回失去的 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 转自http://www.2cto.com/kf/201111/111542.html1. 逆序数所谓逆序数,就是指一个序列S[i],统计处于序列的每个数的比这个数大并且排在它前面的数的数目,然后对于所有数,把这个数目加起来求和就是了。比如4 3 1 24第一个,所以数目为03的前面是4,大于3的数目为11的前面是4 3 ,大于1的数目为22的前面是4 3 1,大于2的数目为2所以逆序数为1+2+2 = 5求逆序数的两种方法常规方法是按照逆序数的规则做,结果复杂度是O(n*n),一般来说,有两种快速的求逆序数的方法分别是归并排序和树状数组法2. 归并排序归并排序是源于分而治之思想,详细的过程可 阅读全文
posted @ 2012-08-07 16:20 找回失去的 阅读(6034) 评论(0) 推荐(0) 编辑
摘要: 同样是线段树,这道题是求区间最值,单点更新。线段树代码愈发熟练。/*2012-08-07 16:02:53 Accepted 1754 1093MS 2276K 1361 B G++ Yu*/#include<stdio.h>#include<algorithm>using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 200020;int Max[MAXN << 2];int n, m;void P 阅读全文
posted @ 2012-08-07 16:05 找回失去的 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 线段树的基础题,之前写过,今天看了刘汝佳的《高级数据结构》又写了一次,对线段树的理解也更深了。/*2012-08-07 15:45:14 Accepted 1166 343MS 736K 1598 B G++ Yu*/#include<stdio.h>#include<string.h>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 50050;int sum[MAXN << 2];int n;void PushUp(int rt 阅读全文
posted @ 2012-08-07 15:48 找回失去的 阅读(179) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 29 下一页