HDU 1540 Tunnel Warfare
摘要:线段树求一个点所处区间的最大连续长度,用lsum记录区间的左连续长度,rsum记录区间的右连续长度,查询时判断p点处于左子树还是右子树,然后计算左子树的右连续长度+右子树的左连续长度的和。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1const int MAXN
阅读全文
posted @
2012-08-24 17:19
找回失去的
阅读(189)
推荐(0)
POJ 3225 Help with Intervals 线段树区间操作
摘要:/*Accepted 2364K 969MS C++ 2769B 2012-08-22 16:54:26*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1const int MAXN = 131072;bool hash[MAXN + 1];int col[MA
阅读全文
posted @
2012-08-22 16:58
找回失去的
阅读(164)
推荐(0)
POJ 3667 Hotel 线段树区间合并
摘要:线段树的区间合并,其中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
找回失去的
阅读(165)
推荐(0)
POJ 2761 Feed the dogs
摘要:求区间第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
找回失去的
阅读(347)
推荐(0)
HDU 4325 Flowers
摘要:线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在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
找回失去的
阅读(441)
推荐(0)
HDU 1698 Just a Hook
摘要:线段树成段更新的基础题,每次操作将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
找回失去的
阅读(130)
推荐(0)
HDU 1394 Minimum Inversion Number
摘要:线段树的一个应用,求逆序数。思路为: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
找回失去的
阅读(190)
推荐(0)
HDU 1754 I Hate It
摘要:同样是线段树,这道题是求区间最值,单点更新。线段树代码愈发熟练。/*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
找回失去的
阅读(122)
推荐(0)
HDU 1166 敌兵布阵
摘要:线段树的基础题,之前写过,今天看了刘汝佳的《高级数据结构》又写了一次,对线段树的理解也更深了。/*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
找回失去的
阅读(182)
推荐(0)