随笔分类 - 线段树
摘要:原题链接:http://122.207.68.93/OnlineJudge/problem.php?id=1292 线段树+扫描线。这道题是典型的矩形面积并问题,乍一看109 * 109 * 105超了long long,但这个无关紧要,其实如果总面积>1018可以直接判断肯定有相交的面积了,这么一来,就是裸模版题了,贴膜板: 1 #include "cstdio" 2 #include "iostream" 3 #include "algorithm" 4 #define lson cur<<1 5 #define
阅读全文
摘要:原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4969 这题请教了牛B的安神才会了。 这道题是线段树的题目,解题思路是把一颗树及其子树用线段(区间)来表示,然后对区间进行修改查询操作。我的具体做法是这样的:对整棵树进行先序遍历,也就是一趟dfs,遍历过程中记录下访问节点的时间戳,那么dfs访问前和递归回来的往返过程得到两个时间点(id[i].l, id[i].r),也就是我们所转换成的区间的端点,由于是先序遍历,那么一棵子树内所有节点是连续的,则最后根节点的区间必定包含其子树节点的区间,这样就构成了线段树...
阅读全文
摘要:原题链接:http://codeforces.com/problemset/problem/219/E 这题和hotel那题很像,一开始想到的是用线段树,设0为空位,1为占位,那么需要维护左端最长0,右端最长0,中间最长0,然后在插入删除操作中需要考虑区间的合并,区间的分解等问题……瞬间就被恶心到了。 网上看到别人一种奇妙的做法,运用STL里面的set容器进行一个模拟线段树而又类似贪心的做法,代码量大大减少了,写起来非常方便。用了set容器,那么这道题就是纯粹的对set进行增加删除元素了。View Code 1 /* 2 代码出处:http://www.cnblogs.com...
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4417 划分树 + 二分。 总复杂度为mlog(n)log(n),在O(10^7)左右,可以破了,二分查询区间第k大值,如果该值小于或等于给定高度,那么继续二分。那么最后得到的k值就是所求。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 const int maxn = 100000 + 10; 5 6 int tree[20][maxn], num[20]
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3473 做出这题感觉又帅了。 划分树。 一看题目很容易想到每次查询求的x就是该区间排序后的中位数,再看看规模,不难想出得用划分树nlog(n)。 尽管题目给了8s的时限,然而,如果每次只是求出中位数在循环一遍区间去求答案,也会TLE,所以,另开数组lsum[],在建树的时候记录放到左子树的元素的和,则可在每次询问的时候,如果在树的某一层要进入右子树,那么,该区间进入左子树的所有元素的和都是小于中位数的。 另外,如果这题写丑了会卡掉内存的,当时我写的时候是开两个数组lsum[]和rsum...
阅读全文
摘要:原题链接:http://poj.org/problem?id=2352 线段树,单点更新,区间查询,200+ms。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson (cur << 1) 4 #define rson (cur << 1 | 1) 5 #define N 32005 6 7 int tree[N << 2], ans[15001]; 8 9 void pushup(int cur)10 {11 tree[cur] = tree[lson
阅读全文
摘要:原题链接:http://poj.org/problem?id=2182 线段树。 从后往前寻找,首先是找第a[n]大的数,找到后记录到答案数组里并删除改叶子节点,然后在剩下的数字中再找a[n - 1]大的数,直到n次寻找完成。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson (cur << 1) 4 #define rson (cur << 1 | 1) 5 #define INF 0x3f3f3f3f 6 #define N 8005 7 8 int a[N]
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4027 线段树。 一个很大的数(< 263),最多也就进行几次开平方操作就会达到1了,所以每次更新,如果区间有的点不为1,那么就直接更新它,如果,区间的值都是1了,那么必须直接返回。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <stdlib.h> 5 #define lson (cur << 1) 6 #defi
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3397 线段树,区间合并。 节点记录的信息如下: int l, r, c; // 区间左端点,右端点,长度 int lsum1, rsum1, msum1; // 左连续1长度,右连续1长度,区间最长连续1长度 int lsum0, rsum0, msum0; // 左连续0长度,右连续0长度,区间最长连续0长度 int sum; // 区间1的个数 题目许多更新询问操作都是比较熟悉的了。 这道题对于01反转操作我是这样做的:从上面列出来的节点信息...
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3308 线段树,区间合并。 节点记录下面变量: int l, r, c; // 区间左端点、右端点和区间长度 int lv, rv; // 区间左值,右值 int lsum, rsum, msum; // 区间左上升长度,右上升长度,区间最大上升长度View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson (cur << 1) 4 #define rson (cur << 1
阅读全文
摘要:原题传送:http://poj.org/problem?id=3667 线段树。 线段树题目做得还是太少了。这道题对新手来说是一道坎,虽然很容易得出思路,但是一细想会觉得挺恶心的,本想参考别人的AC代码,但一看就思密达了。只能静下心来,花几个小时甚至几天来做,还是会有很大收获的。 这里有一份不错的结题报告:http://bbs.byr.cn/wForum/disparticle.php?boardName=ACM_ICPC&ID=18374&listType=1 题目大意是有一个旅馆,其中有N个房间,初始化都为空,接下来有M个操作: 操作1,形式为1 d,表示需要在旅馆中找..
阅读全文
摘要:原题链接:http://poj.org/problem?id=2777 水线段树,打上lazy标志,节点保存区间颜色值,如果区间颜色有多种,那么保存值为 -1。 记录颜色数的时候一定要用位运算,再不济也用个数组哈希一下。(而我一开始用STL的set,神啊,TLE了一下午啊!还以为是写线段树出的问题,没想到STL这时候慢的一逼啊!恰巧POJ的C++编译器挂了!用G++交就更慢了!慢了慢了就TLE了!)View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson cur << 1, l,
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=1394 求逆序数。 题目上来一看,发现直接暴力可过,复杂度O(n2),300+ms,代码简短得要命:View Code 1 #include <stdio.h> 2 3 int a[5005]; 4 5 inline int min(int x, int y) 6 { 7 return x < y ? x : y; 8 } 9 10 int main()11 {12 int i, j, n, ans, m;13 while(scanf("%d", &n)
阅读全文
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4288 线段树。 技巧有一下几个: 1. 先把数据全部输入完毕后再统一查询,进行排序预处理方便计算出元素位置(线段树的堆底是静态的); 2. 每个区间节点保存mod 5 = 0...4这5个值; 3. 合并区间时,左孩子起点就是当前区间起点,可以直接合并,但是相应的右孩子节点变为(k + 5 - num(lson) % 5 ) % 5 (k为合并前mod5的点,num(lson)为左孩子的点数)。线段树 1 #include <stdio.h> 2 #include <st...
阅读全文

浙公网安备 33010602011771号