随笔分类 - 线段树
hdu 4747 Mex
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4747设我们输入的数组为 a[],我们需要从 1 到 n 遍历, 假设遍历到 i 时,遍历的过程中用b[j]表示从 i 到 j 没出现的最小自然数先从 n 到 1 扫一遍求出从 1 到各个点的b[j]值然后遍历a[] 实际上就是不断的把当前a[i] 去掉,比如说去掉a[3]时,剩下的b[4]---b[n] 就表示从4到其他后续点形成的区间中没出现的最小自然数要知道从 i 到 n ,b[]的值始终是单调递增的我们每去掉当前a[i]会对b[]数组产生影响,设下一个和a[i]相等的数出现的位置是 r 那么去掉a[i
阅读全文
hdu 4614 Vases and Flowers
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4614直接线段树维护代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;typedef long long ll;typedef unsigned int uin
阅读全文
zoj 2319 Beautiful People
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1319这题给人的第一感觉就是最长上升子序列,按S排序,对B进行求解最长上升子序列,但是N太大o(n^2)肯定不行,所以要用优化,我是用了线段数进行优化。不是经常用类,这次用了一下,还是有很多小问题的,如果在函数内部静态申请一个局部变量对象由于对象内有很大的数组,这样就相当于在函数所占用的栈区内申请了很大数组,没有语法错误,但c++是不允许它执行的换成从堆区申请就好了,不过要记得delete否则会超内存DP思想+线段树优化代码:#include<iostream>#
阅读全文
hdu 4351 Digital root
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4351线段树 每个节点保存前缀 后缀 和 剩余情况 中(k)(0<=k<=9) 是否出现除了叶子节点外 其它节点要用左右孩子 来维护求答案时类似 维护的过程中有重复的计算 需要用打表和位运算来优化 否则超时注意0的情况代码及其注释:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<stack>#
阅读全文
poj 3277 City Horizon
摘要:http://poj.org/problem?id=3277经典的矩形面积并 对y离散后 建树 用拆点后的以x为顺序 依次更新代码:#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#include<queue>#include<cstring>#include<set>#include<cmath>#include<algorithm>#define LL long longusing namespace
阅读全文
poj 1151 Atlantis
摘要:http://poj.org/problem?id=1151几何面积并 离散化线段树 #include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#include<queue>#include<cstring>#include<set>#include<cmath>#include<algorithm>#define LL long longusing namespace std;const int N=105;st
阅读全文
hdu 4302 Holedox Eating
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4302给一个一维的线段L 小动物最初最0点两种操作0 x 在x位置添加一个吃的1 小动物去吃一个距离它最近的一个吃的 左右距离相等的话选择上一个选择方向这个题既可以用线段树 也可以用优先队列用优先队列 代码短 好理解 效率高但这题确实是一个练习线段树的好题线段树代码及其注释:#include<iostream>#include<stdio.h>#include<string.h>#include<queue>#include<cmath>#inclu
阅读全文
poj Asimple Problem With Integers
摘要:http://poj.org/problem?id=3468题目大意:给你n个整数,两种操作,求一段区间的和一段区间内全部加上某个整数简单线段树题区间内一部分是固定区间和另一个是此区间内每个数都需要加的量注意用64为整数详情见代码注释:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<algorithm>using namespace std;cons
阅读全文
poj 2750 Potted Flower
摘要:http://poj.org/problem?id=2750最近在poj上做的线段树题 c++提交要比g++提交快很多,我知道c++要快一些,不过快的有点离谱了吧,都左右是否超时了题目大意:n盆花围成圈 每盆花都有它的value要做一个弧形长椅 不能是一个圆,因为必须有缺口,使得长椅附近花的value值和最大m次替换 每替换一次问替换后的最佳答案本题的难点在于环,因为线段树的建立是线状的所以在求最终答案是要注意线段树要保存本段从左起最大值,最小值,从右起最大值,最小值,和总体最大值,最小值,总和最大值和最小值都必须至少包含一盆花这都是为求最后答案做准备。最后答案基本分两种1.最小值为正,此时用
阅读全文
poj 2886 Who Gets the Most Candies
摘要:http://poj.org/problem?id=2886这个题和插队买票那题一样 http://www.cnblogs.com/liulangye/archive/2012/06/11/2545529.html题目大意:一些人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出了的人所得到的糖果数量和他跳出的顺序有关线段树在这里只是一个二分搜索的作用思路:1.求第几个跳出者所得糖果数量2.根据输入范围,求的第几个人是得到糖果最多的 假设是J3.建立线段树,线段树区间表示区间内人的个数,搜索第几个人时所经过的路径区间人数的减一然后根据提示求的下一个跳出的人是谁 并记录第J个人是谁代码及其注释:
阅读全文
poj 2777 Count Color
摘要:http://poj.org/problem?id=2777不多说了 和贴海报那题一样 http://www.cnblogs.com/liulangye/archive/2012/06/11/2545349.html代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<algorithm>#include<vector>using nam
阅读全文
poj 2828 Buy Tickets
摘要:http://poj.org/problem?id=2828坑爹呀你c++ 跑不到2000g++ 直接超时有这么夸张吗 无语了题目大意:买票 不过有插队的 n个人依次插队给你插队位置和value 问你最后value顺序其实就是最后人的顺序这题最好倒着插入因为 最后一个人如果插在第m个空的后面 那么他一定在m+1的位置倒着来的话 无路第几个人 他插在第m个空的后面 那么他的左面就需要m个空位在这里线段树只不过用来二分搜索代码及其注释:#include<iostream>#include<cstdio>#include<cstring>#include<s
阅读全文
poj 2528 Mayor's posters
摘要:http://poj.org/problem?id=2528题目大意:贴海报 有先后顺序会发生覆盖 问你最后漏在外面的有几张海报思路:1.所给数据范围比较大,而且是以块为单位 所以首先要离散化排序+把块变成线2.建树3.按所给海报顺序进行贴海报 解决覆盖问题4.搜索一遍 看看有哪些海报是漏在外面的 统计数量代码及其注释:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#inclu
阅读全文