线段树
文章平均质量分 79
yrleep
大学毕业不久,ios游戏自由开发者。
展开
-
poj 3067 japan 树状数组
求逆序对的题目上次求逆序对用了归并排序这次就尝试了树状数组,感觉树状数组要好写些,速度应该也会比较快题解先对边按左排序,然后对右求逆序对求逆序对的时候有一个需要注意的,同一个起点出发的不会造成交叉所以先把同一个起点的店都先getsum(),然后再分别insert() #include #include#includeusing namespace std;int n,m,t原创 2013-04-14 19:37:05 · 1536 阅读 · 0 评论 -
hdu 4578
很明显的线段树的题目,但是挺麻烦的,三个lazy,三个值,并且lazy之间的关系要处理好。加法的操作需要推一下。#include #include #include #define ls t<<1#define rs t<<1|1#define midt (tr[t].l+tr[t].r)>>1using namespace std;const int maxn=1e5+9;c原创 2013-08-10 21:40:21 · 1031 阅读 · 0 评论 -
hdu 4446
官方题解1.一开始开2个队列a,b。a为答案队列,b为临时队列2.找出当最小的C值为C[k](相同时取k最小的)a)C[k]=0:将k加入a,-k加入b。在C序列中删除元素C[k],并将C[1]到C[k-1]减一。b)C[k]>0:将b队首的元素p取出加入a,并将C[-p+1]到c[n]减一。重复做直到所有元素进入a或者b3.将b接在a后面,倒序就是原创 2013-08-11 16:43:11 · 1641 阅读 · 0 评论 -
poj 3657
非常考分析能力的一个题目。 因为这个答案是满足单调性的,可以二分,转化成判定性问题之后。这么考虑,如果把所有的询问按照回答降序排列,然后每处理一个询问的时候,先看它的区间是否被完全覆盖,如果是,则矛盾,否则把它的区间覆盖。 解释一下,每次覆盖的时候,意思就是这个位置不能放更小的值,如果有一次询问区间没有空白的位置,证明这个值没有办法放进去。所以矛盾。反之,我们每次都原创 2013-08-11 23:52:23 · 1101 阅读 · 0 评论 -
poj 3622 Gourmet Grazers
我的做法,首先对于这样的数据范围应该想到不能去套用模型,只能往贪心什么的靠,容易证明一个结论:每次选择需要b最大的cow,然后从满足的grass中选择一个最便宜的,这样肯定能够得出最优解。问题转化成了怎么去快速的得出这个数,我的做法是先对grass按照a排序,那么就能二分找到那些a满足条件的grass,那么现在需要的就是从那些grass中找出b满足要求的并且最靠近左边的,这个用线段树来保存原创 2013-08-29 22:40:41 · 1046 阅读 · 0 评论 -
poj 3277 City Horizon 线段树
这个题目要是做过矩形面积并的话其实可以直接上扫描线的做法,我第一感觉就是想这样做的,但是细想想的话,其实是不需要的,因为这些矩形的低都在同一水平线上,所以想到用线段树来维护水平线的高度的做法,这个思路因为不是严格的logn的,所以tle了。 后来想到另外一种做法,先把矩形按照高度排序,那么每次插入的矩形只要底是被用过的话,那么这个矩形肯定被完全覆盖了,那么就只需要依次线查询矩形底部没有用过原创 2013-04-14 19:40:22 · 1040 阅读 · 0 评论 -
poj 3264 Balanced Lineup 基础线段树
多次询问一段连续空间的最大最小值的差 就直接上线段树就ok了#include #include #include #define ls t#define rs t#define midt(tr[t].l+tr[t].r)>>1#define mids (l+r)>>1using namespace std;const int maxn=50000+100;stru原创 2013-04-14 19:40:09 · 475 阅读 · 0 评论 -
poj 2482 Stars in Your Window 线段树
前面几段的描述是一个上等的情书,非常感人,值得一看,哈哈!!题目意思: 给你n个星星,每个星星有一个价值,用一个给定大小的矩形最多能覆盖住多少价值的星星。 这个题目思路很巧妙: 每个星星只能被一定范围的矩形覆盖,用一个点表示一个矩形(我用的是右上角的点),这一个星星可以影响的矩形的标记构成了一个矩形。作这样的改变,把星星的权值加到矩形中,题目就变成了求矩形最大覆盖的问题了原创 2013-04-14 19:40:04 · 475 阅读 · 0 评论 -
hdu 4747 Mex
题意:求所有子区间Mex的和。Mex是最小的,不存在集合里的非负整数思路:首先考虑从1开始的所以Mex值,必然是非递减的,并且可以O(n)求出。(具体看代码)先考虑如何从1开始的Mex值求出从2开始的Mex值1.如果Mex2.如果Mex>a[1],并且该区间内不包含另外一个a[x]==a[1],那么Mex=a[1]。那么我们需要先预处理出next原创 2013-09-20 00:46:47 · 2121 阅读 · 0 评论 -
poj 1389
求矩形的面积并#include #include #include #include using namespace std;const int maxn=1101;int ans;struct{ int l,r,x; int y1,y2; bool ture; int count;}tr[10000];struct data{原创 2013-11-23 20:59:15 · 985 阅读 · 0 评论 -
poj 1823 Hotel 线段树
这个题目意思很简单,就是求连续的最长段。查询次数比较多,时间卡的比较紧之前写了个k*logn*logn的,结果tle了,pushup的时候如果每次都修改到满节点时pushup的话,因为一个区间最多被分成logn次,加上每次pushup最多执行logn次操作,所以复杂度就高了其实更简单一点的方法是当修改了一个节点的局部时,就重新修改该节点的值。这样复杂度就变低了,这样看起来,真的还是得多原创 2013-04-14 19:40:18 · 751 阅读 · 0 评论 -
poj 3368 Frequent values
线段树,每个节点记录lmax,rmax,max 左边频率最高,右边频率最高,整体的频率最高。这样就可以由子区间组合出答案。#include #include #include using namespace std;#define ls t#define rs t#define midt (tr[t].l+tr[t].r)>>1const int原创 2013-04-20 00:09:29 · 799 阅读 · 0 评论 -
poj 2352 Stars 线段树
题目意思:按照y第一关键字,x第二关键字的顺序给你n个点,每个点的level值定义为x值和y值都不大于它的点的个数。要求输出各个level的点的个数。 由于已经排好序,所以每个点进来的时候以前出现的点x值不大于它的点的个数就是它的level值。 由于x,y的值最大只有32000.所以建一棵节点个数为32000的线段树,然后每个点就来的时候查询一下(0,x)然后再更新一下就ok了。原创 2013-04-14 19:39:58 · 618 阅读 · 0 评论 -
poj 2182 Lost Cows 线段树
这个题目做的很差先放着,以后再看#include #include #include using namespace std;const int maxn=8888;struct{ int l,r,sum;}tr[maxn*8];int maketree(int t,int l,int r){ tr[t].l=l; tr[t].r=r;原创 2013-04-14 19:40:06 · 484 阅读 · 0 评论 -
poj 1177 Picture 线段树加扫描线
求矩形周长的并之前做过一个求矩形面积并的题目用到了扫描线这种思想这个题目可以照搬,作两次扫描线,一次x轴,一次y轴,同样标记入边,出边,当边是最外面的边时周长就加上这条边的长度的两倍,入边标志为1,出边为-1,当加入边之后count==0,则表明了这条边是最外面的边。看了解题报告,做法比较高效,一次扫描线就可以。下回再看。#include #include #include原创 2013-04-14 19:40:11 · 557 阅读 · 0 评论 -
poj 3667 hotel 线段树…
题目意思很简洁,就是多次查询连续空段n的最靠左区间,并覆盖,或者把某段变成空。 用线段树维护三个参数,lmaxn,rmax,max分别表示靠左最长连续,靠右最长连续,最长连续。 修改时,父节点的三个参数都能从子节点参数求得(具体看代码),查询时,也能由子节点和父节点的三个参数递归的得到解答。这个过程不是太好讲明白,得自己想,具体的看代码。 #include #incl原创 2013-04-14 19:40:20 · 526 阅读 · 0 评论 -
poj 3321 Apple Tree 线段树
题目意思很简单:给你一颗n个节点的树,每个节点开始有一个苹果,然后m次修改,每次修改使得某个节点的苹果改变,有变成没有,没有变成有。询问的是某个节点及其子树的苹果数目。 刚开始直接水,直接建树模拟,tle了,因为如果树的高度非常大的话,每次修改的复杂度是o(n)的。 然后改用线段树,每次询问一个区间的苹果数目,修改的是一个点的值。只要每科子树的节点编号是连续的就可以用线段树做了。原创 2013-04-14 19:39:52 · 580 阅读 · 0 评论 -
poj1389 Area of S…
这个是线段树的经典题目了。求n个矩形的面积并。 解法:把y坐标离散化,输入的矩形转换成两条平行于y轴的线(然后按x坐标排序)分别为入边和出边,然后对y轴建立线段树,依次插入线段。这个做法文字不好解释,具体的看代码吧。#include#include#include#includeusing namespace std;const int maxn=1101;int ans;原创 2013-04-14 19:40:02 · 572 阅读 · 0 评论 -
poj 2104 K-th Num…
题目意思非常很简单。给十万个数,每次询问一段连续区间的第k大值。询问次数达到5000次。 在线段树中搜索出来的题目,但是很明显,区间需要记录什么信息才可以查询第k大值就很不好想。 最后想到,只有把这一段中的每个数的大小编号记录才能满足要求,那么就是把这一段中的每个数排序,那么存储的空间就变成了nlogn,构树的时间复杂度也是nlogn,线段树支持一个查询。一段中小于等于tmp的原创 2013-04-14 19:40:13 · 519 阅读 · 0 评论 -
poj 3468 A Simple…
裸的线段树的题目,修改区间,查询区间。#include #include #include #define ls t#define rs t#define midt(tr[t].l+tr[t].r)>>1using namespace std;const int maxn=111111;long long a[maxn];struct{ int l,r;原创 2013-04-14 19:40:15 · 539 阅读 · 0 评论 -
poj 3225 Help with Intervals
题目意思不再重复了,有中文的题意思路:区间的开和闭直接开两倍的点数就可以了,奇数的表示边界点,偶数的表示比边界点大一点点的点。 然后这几个操作总的是要做区间覆盖和区间抑或。 覆盖的话非常简单,不再叙述。 抑或的话最直接的想法就是找到相同的区间,然后再做抑或操作。就是找到一个满区间时,如果区间内的点不是全部为0或者全部为1,则继续向下找。直到找到都是相同的为止。原创 2013-04-14 19:40:26 · 541 阅读 · 0 评论 -
hdu 4052 Adding New Machine 扫描线求矩形面积并
这个每一个矩形都确定了一个不能放的矩形空间,那么就是可以转化成求矩形面积并了。#include #include #include #include #include #define ll long long#define midt (tr[t].l+tr[t].r>>1)#define ls t<<1#define rs t<<1|1using namespace std;原创 2013-12-04 15:04:52 · 960 阅读 · 0 评论