
线段树
文章平均质量分 55
priority_ez
这个作者很懒,什么都没留下…
展开
-
hdu 1394 (Minimum Inversion Number
题意:给你N个数是0~N-1,要求统计它的所有形式的逆序对的最小值。它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面。分析:注意到给出的数是0~N-1,那么对于第一个数的逆序对个数就是a[1]个。若将第一个数放到数组最后,那么逆序对将减少a[1]个,增加N-a[1]-1个。所以我们只要预处理出一开始数列的逆序对个数再一个一个将数放到队尾即可。代原创 2016-10-22 21:28:46 · 367 阅读 · 0 评论 -
bzoj3779 lct+线段树+dfs序
题意:有一棵n个节点的树,每个节点有一个颜色,初始每个节点颜色不相同,且以节点1为根。定义每个点的权值为这个点到根的路径上不同颜色的个数。现在进行m次操作,每次操作为下列三种之一: 1、将x到当前根路径上的所有点染成一种新的颜色; 2、将x到当前根路径上的所有点染成一种新的颜色,并且把这个点设为新的根; 3、查询以x为根的子树中所有点权值的平均值。分析:首先我们观察到:操作一每次修改都是原创 2017-02-21 22:05:07 · 554 阅读 · 0 评论 -
poj3667 线段树
题意:有N个房间,M次操作。有两种操作 (1)”1 a”,表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住。 (2)”2 b len”,把起点为b长度的len的房间清空,即退房。分析:明显线段树的题。 lx表示区间左起连续空房的最多间数。 rx表示区间右起连续空房的最多间数。 mx表示区间的最多连续空房间数。 lazy表示整个区间的房间是否被全住满(全是空)查询的时候:原创 2016-11-03 19:38:25 · 512 阅读 · 0 评论 -
hdu4578
题意:给你一个数组,初始值为零,有四种操作: (1)”1 x y c”,代表 把区间 [x,y] 上的值全部加c。 (2)”2 x y c”,代表 把区间 [x,y] 上的值全部乘以c。 (3)”3 x y c” 代表 把区间 [x,y]上的值全部赋值为c。 (4)”4 x y p” 代表 求区间 [x,y] 上值的p次方和1<=p<=3。分析:明显是线段树维护的题。 一看只有1~3次方就原创 2016-11-02 16:04:08 · 788 阅读 · 0 评论 -
fzu2105
题意:题意:给你N个数,有四种操作。 (1)”AND opn L R”,表示对区间[L,R]内的数全部与opn进行且(&)操作。 (2)”OR opn L R”,表示对区间[L,R]内的数全部与opn进行或(|)操作。 (3)”XOR opn L R”,表示对区间[L,R]内的数全部与opn进行异或(^)操作。 (4)”SUM opn L R”,求出区间[L,R]的数的和。分析:由于一个数x原创 2016-10-29 21:56:36 · 524 阅读 · 0 评论 -
hdu4533
题意:给你N个矩形,每个矩形给出左下角坐标,右上角坐标,有M个询问,每个询问给出一个时间t,问(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。分析:首先我们观察到求的是(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。 ①这是一个正方形,那么我们可以尝试将其转换成一个线段。 (因为n≤20000) ②注意“重叠的面积”。 于是我们分成三个阶段。 在这个阶段,计算原创 2016-10-29 16:27:52 · 538 阅读 · 0 评论 -
hdu3308
题意:给你N个整数,有两种操作, (1)”U A B”,表示把第A个数变成B。 (2)”Q A B”,表示查询区间[A,B]的最长连续上升序列。分析:明显是线段树的题。 lx表示区间左起最长连续上升序列的长度。 rx表示区间右起最长连续上升序列的长度。 mx表示区间最长连续上升序列的长度。 vl表示区间左端点的值。 vr表示区间右端点的值。合并区间:如果当前区间的左儿子的lx等于原创 2016-11-03 21:26:29 · 741 阅读 · 0 评论 -
poj3468
题意:给你N个数,然后有M个操作。有两种类型的操作, (1)“Ca b c”,表示将区间[a,b]里的数加上c。 (2)“Q a b”,表示查询区间[a,b]的数的和。分析:线段树维护区间修改区间求和代码:#include<cstdio>#include<cstring>using namespace std;const int N=1001000;int a[N],n,m,x,y,z原创 2016-10-23 21:48:23 · 505 阅读 · 0 评论 -
hdu1698
题意:给你T组数据,N个数(初始时每个数的值为1),M个操作,每个操作把区间[a,b]里的数更新为c,问最后这N个数的和是多少。分析:线段树区间修改区间求和。代码:#include#includeusing namespace std;const int N=1001000;int n,m,l,r,z,cas;struct tree{int l,r,sum,la原创 2016-10-23 17:42:33 · 388 阅读 · 0 评论 -
hdu1754
题意:给你N个数,M个操作,操作分两类。(1)"QAB“,查询区间[A,B]内的最大值。(2)"UAB",将第A个数的值改成B。分析:线段树单点修改区间维护最大值。代码:#include#includeusing namespace std;const int N=1000100;int n,m,a[N],x,z;struct tree{int l,r,原创 2016-10-23 17:12:15 · 393 阅读 · 0 评论 -
hdu 1166
题意:有N个兵营,每个兵营都给出了人数ai(下标从1开始),有四种命令(1)”Addij",表示第i个营地增加j人。(2)“Sub i j”,表示第i个营地减少j人。(3)“Query ij",查询第i个营地到第j个营地的总人数。(4)”End“,表示命令结束。分析:一道极水的线段树,单点修改乱搞就好了。代码:原创 2016-10-22 22:15:56 · 364 阅读 · 0 评论 -
线段树总结
线段树是一个重要的东东,还是要好好整理的。刷了题便整理了一下(留坑待填)一、单点更新二、成段更新三、区间合并四、扫描线原创 2016-10-22 21:09:12 · 952 阅读 · 0 评论