摘要:
扫描线算法+线段树维护简介: 像这种求面积的并集的题目,就适合用扫描线算法解决,具体来说就是这样 类似这种给出点的矩形的对角的点的坐标,然后求出所有矩形面积的交集的问题,可以采用扫描线算法解决。图如下,我们要求红色部分的面积: 我们可以通过一条叫扫描线的东西解决问题。具体来说: 我们首先给自己一条线 阅读全文
摘要:
这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通。 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建。 这个其实也是非常典型的线段树区间合并,正好可以学一下。 我们给线段树的结点赋予5个值,l 区间左端点, 阅读全文
摘要:
这题太坑了。。。满满的都是坑点 1号坑点:给定左右区间有可能是反的。。。因为题目上说x,y之间,但是没有说明x,y的大小关系(害我一直RE到怀疑人生) 2号坑点:开根号的和不等于和开根号(还好避开了) 3号坑点:当你明白了2号坑,你就会选择。。。单点更新,然后你就T飞了。其实一个1e18的数,开不了 阅读全文
摘要:
这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急。 我们把左边的坐标+1,即可,那么[0,3]其实变成了[1,3]而线段树是按照点询问的,也就是每个点代表的颜色,我们就有了1,2,3,这个三 阅读全文
摘要:
这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可。 我自己做的时候太傻逼了。。。把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右的中间值,而不是更新区间的中间值(太菜了)。 阅读全文
摘要:
这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散, a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新离散的位置,但是a[2]和a[3]明显不重叠,为此我们需要重新考虑离散的内容,其实不妨这样,如果区间 阅读全文
摘要:
由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记打上,当节点表示的区间是完全被询问区间包含,那么这个区间的信息都是有用的,因此我们其实只需要把这个节 阅读全文
摘要:
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以。 注意更新的时候区间的选择,需要对区间进行二分。 阅读全文
摘要:
#include #include #include #include using namespace std; const int maxx = 50030; int arry[maxx]; struct node { int left; int right; int mid; int val; } a[maxx*4]; void pushup(int root... 阅读全文
摘要:
这个也是一个线段树的模板 题,只需要添加laze标记,并且在不断的维护中,保存更新并pushdown下去,然后为了避免重复,搞一个set就行。 阅读全文