摘要:
http://poj.org/problem?id=1177 经典线段树,求矩形并的周长。把坐标排个序,然后插入线段树,求其变化的和就可以了。轻松1y~View Code 1 #include <cstdio> 2 #include <algorithm> 3 #include <vector> 4 5 using namespace std; 6 7 #define lson l, m, rt << 1 8 #define rson m + 1, r, rt << 1 | 1 9 #define root -10001, 10001 阅读全文
摘要:
http://poj.org/problem?id=1151 数据量比较小,不过也是可以先离散坐标,再构建线段树,然后用扫描线在每个关键位置插入/删除线段并进行面积相加。View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <map> 5 #include <vector> 6 7 using namespace std; 8 9 map<double, int> id; 10 vector<doubl 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=2133 蔡勒公式求某一天是周几。View Code 1 /*** 蔡勒公式,求某一天是周几(hdu 2133)***/ 2 #include <cstdio> 3 4 const char *ans[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 阅读全文
摘要:
最近数据结构课给了一个二叉树的作业,给出二叉树的中序和后序遍历的序列,要求构建出改二叉树。我最初的时候是想到用map和RMQ来,以稳定O(nlogn)的时间构建这棵树。这样的复杂度已经是比普通的构建方法最坏情况O(n^2)(也就是单链的情况下)的复杂度要快不少的了。不过,今天在我打模板的时候找回我的笛卡尔树算法,那时忘记了是用来处理RMQ转LCA还是LCA转RMQ的了。于是,我就去回顾了一下LCA和RMQ的资料,发现RMQ是可以转成LCA的,其中区间最小值就是二叉树的对应的那两个端点结点的LCA(最低公共祖先)。以RMQ构建出来的树也恰好是我们想要的树。代码测试通过过小数据,准备用大数据来.. 阅读全文
摘要:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3623 简单二维树状数组题。单点询问,两种更新(按行或者按列)。直接用二维的线段树,最多将更新的区间划分为3个。代码如下:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int size = 105; 8 9 struct BIT2D { 10 int key[size][ 阅读全文
摘要:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 这题以前我曾经是用k大数DC搜过去的,每次k大前都复制区间,理论上那是必然超时的。今天我用线段树套SBT过了这题,不过其实用树套树做,最后还是要二分结果区间来得到最终的结果,复杂度是O(nlognlogn)。最近看了可持续化数据结构的论文,这题用可持续化线段树可以使代码更简单,内存消耗更小,虽然复杂度貌似没有变。 这题建立多棵平衡树以后,在使用完以后必须销毁,不然会MLE的!代码如下:View Code 1 #include <cstdio> 2 #inc 阅读全文
摘要:
http://poj.org/problem?id=3225 线段树,【区间更新,单点查询】。 题意很容易明白,开始的时候假设集合为空,然后通过一系列的操作后输出最终的集合是什么。 因为数据范围比较小,不用离散化。把每个端点和区间分离出来,然后构建线段树,线段树只标记每个结点的状态。每个操作其实可以看成是对区间异或或者对区间赋值,其中是怎么结合的看代码。异或的更新没写好,wa了两次,这是到现在还错的东西。。。囧!代码如下:View Code 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring 阅读全文
摘要:
http://poj.org/problem?id=2155 二维树状数组【区间更新,单点查询】,一道简单题!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int maxn = 1005; 8 struct BIT2D { 9 int size;10 bool val[maxn][maxn];11 12 void init() {13 memset(val, false, si... 阅读全文
摘要:
http://acm.timus.ru/problem.aspx?space=1&num=1650 用线段树统计的模拟题,开始的时候数组开小了,以为城市只有50000个,所以wa了两次,后来开大了就过了!~ ^_^这题用STL解决代码量比较小,据说可以用set来充当我的线段树。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <set> 6 #include 阅读全文
摘要:
http://acm.timus.ru/problem.aspx?space=1&num=1067 这题是模拟一个目录,我用到字典树来做这题。 这题我是用大量stl来减少代码量,不过我对stl的功能并不是完全的熟悉,所以用起来有点别扭,代码时间也大约用了半个多小时,不过最后稳稳的1y了!~参考代码:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 阅读全文