随笔分类 - 数据结构
摘要:题意:现在有n辆bus,然后有m个乘客。每辆bus有自己相应的开车路段,与开车时间。s,f,t,表示开车的起始站,终点站,开车时间。l,r,b分别表示乘客想要从l到达r站,然后乘客开始等车时间为b。那么就可以猜想到这个乘客要搭乘这辆车,需要满足一下条件s<l,r<f,t>b,那么此时我们按照起始点排序把所有的路段都包含进来,按照时间点来建立线段树,然后从单点更新,剩下的自己来看一下吧。。。View Code 1 #include<iostream> 2 #include<stdlib.h> 3 #include<algorithm> 4 #
阅读全文
摘要:只要明白下区间如何更新上区间就可以了,左区间和右区间中只能、可能是右区间右边界中有'w',然后右区间左边界有'b''w',或者是右区间左边界有'w',左区间右边界有'w''b',满足这个情况下面,才可能上面的区间wbw组合增多。所以只要明白这个就ok了。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 const int N = 50005; 5 int cover[N&
阅读全文
摘要:既然这道题目要我们维护出现在%5=3位置上面的值,那么我现在想想是不是这个线段区间上面只可能有5种状态的线段树出现。那么我就只用维护这五种状态,最后只用看3状态上面的数字之和为多少就ok了。。当然还是要来一个离线处理,因为你现在必须知道对于这一整组数据而言要建立多大的一颗线段树。View Code 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<string.h> 5 #define LL __int64 6 using std::unique; 7
阅读全文
摘要:其实这道题真的告诉了我一个道理,那就是仔细看题,题目中明确说出了1就是所有子树的根结点。我们可以想一想,现在每个结点代表着一段区间的询问,所以我们必须利用深搜的时间戳来找出所有结点所代表的区间。前向星见图自然不可少。更新区间的话,我们必须用离线处理,[i,j]这个区间代表着第i个数在这个区内出现k次的数的个数。View Code 1 #include<algorithm> 2 #include<iostream> 3 #include<string.h> 4 #include<cstdio> 5 #include<vector> 6
阅读全文
摘要:一开始接触到这道题目的时候就有了思路,应该是之前做线段树出来的结果吧,不过这个更新真的想了很久。把其中的红、绿、蓝以1、2、4来代替,那么通过位运算就能将其他的颜色状态都演化出来。代码部分就更新部分最精华,这还是参考的网上的某位大哥的神作而得来的。。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #include<stdlib.h> 6 #define LL __int64 7 using st
阅读全文
摘要:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #define LL long long 6 using std::sort; 7 const int N = 100005; 8 struct Order 9 {10 int l,r,id;11 bool operator <(const Order & tmp)const12 {13 return r<tmp.r;14 }15 }ord
阅读全文
摘要:开始看到这道题目的时候,神题啊。。 想了一个下午,没思路。。。后面到网上一看这位大哥的解说,豁然开朗http://blog.csdn.net/gotoac/article/details/7588254每个区间分割多边形是可能是三角形或者梯形或者四边形,都是上底+下底乘高除2,这个小学就会的东西,看来现在还是不能够活用的啊。。。。View Code 1 #include<iostream> 2 #include<stdlib.h> 3 #include<cstdio> 4 #include<algorithm> 5 using std::swap
阅读全文
摘要:仔细分析的话,不用说了,我只是尽自己的力量去写一个尽量好看的代码。。。思路说一下: 就是先统计这个点的上区间有多少点,下区间有多少点,然后x排序再求上下区间,这个时候便可以得知已经更新进去的点一定在该点的左下方、左上方、下方。。。 由此统计出每个点被作为标准点画出,每个人的得分情况。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<string.h> 6 using name
阅读全文
摘要:刚刚敲完空间体积相交,但是这道题竟然一开始没有思路,果然还是该打,总结线段树的做题经验就是要仔细看数据的范围。解题思路:因为每一种植物的价值最大不过到100,那么我们需要的价值就是面积*价值,那么我们何不把价值作为第三个坐标轴z轴栏运算呢~ 接下来不说了,,看代码View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using std::unique; 6 using std::sort; 7 const in
阅读全文
摘要:解题思路: 一开始看题完全没思路,本来以为要建一个三维的线段树,以为暂时不能够动了,但是之后忍不住了,看了解题报告,原来是枚举z轴上面的值就可以了,这样猥琐过都可以。。。看来还是自己观察数据不够到位。。。 然后针对每一层z轴,建立一个线段树,对覆盖三次以上的面积求和,然后再求体积。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<string.h> 6 using std:
阅读全文
摘要:刚刚看到二维线段树,吓到了,,还以为很难的类。。 刚刚入门的话,其实很简单的啦,之后就不知道了。其实就是在原来的一维线段树上面再建立一维就ok了。。。 但是我在想的是 现在是因为数据不够大,要是大了怎么办,哎,还没做到那样的题,先不管了因为每个节点都只用记录最大值。。 仔细看代码吧。。 我已经尽力调到好看了。。。View Code 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<stdlib.h>
阅读全文
摘要:实在惭愧。。。理解错了题意还A了。。题意:现在第i个数字表示i这个数字放在第几个位置上面,如果这个位置上面已经有数字则向后移动。一开始我以为是先将所有的数字放好位子之后+二分最长上升就可以,但是思路错了,真正应该记录的值是i这个数字存放在哪个位子,我们在保证数字一定上升的基础上,来求位子的上升。因为第一个数字放的是1,第二个为2,这样的话我们就能求出每次放一个数字产生的最上升序列长度了。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 const int N
阅读全文
摘要:题意描述:给定一个矩阵,输入为左上角和右下角,现在要计算出所有矩阵重叠之后的面积总和。解题思路:根据x轴或者y轴建树,不过数据如果够大,必须先离散化,利用扫描线记录当前区间已经被覆盖的长度,那么现在覆盖的长度乘以下一条线段的距离,这个面积则是我们需要累加的面积。其中的测试数据计算过程如下:View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<string.h> 6 using st
阅读全文
摘要:不绕弯子,线段树区间值维护。每个区间应记录的值,lazy,val[12],val数组当中记录的是该区间当中每一个级数最大的经验值,如果此时经验值能够使得英雄升级,在一段区间当中有某个结点需要更新,此时我们如果用update操作的话,就要更新到最底层,那么此时线段树就没有意义,所以现在我们必须要控制一下, 只更新升级了的区间,那么我们就避免了更新一些不必要的点,因为当区间中的英雄级数不变的时候,经验累加的规则是不会改变的,所以只要精心敲一下其中的pushdown就ok了。在向下的更新当中,最终要的是,更新了底层的话,上层也必须要更新,所以要特别注意,总结线段树的经验,其实最要紧的就是心要够细,如
阅读全文
摘要:思路: 线段树结构更新维护,结构内部包括 1的最大左连续、最大右连续、最大连续长度,0的最大左连续、最大右连续、最大连续长度,1的个数、覆盖值、取反,一共9个值,其中的取反操作要特别注意,其余的看代码吧。。 如果代码看不懂的话,建议先做一下区间最大连续和、还有poj 3225.View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 const int N = 100003; 5 struct node 6 { 7 int lo,ro,mo; 8 int ...
阅读全文
摘要:题目描述:输入包括n,m,n表示现在一共有n个相邻的房间,m表示有m条命令。1 a 表示现在来了一个人数为a的队伍,需要一个连续的区间能够容纳这么多人,如果能够容纳,输入最靠左边的房间的号码,否则输出0。2 a,b 表示清空[a,a+b-1]区间内所有的房子解题思路: 线段树结构体,定义需要记录的三个值,最大左连续、最大右连续、最大连续。由上面的图可知,我们现在要更新两端区间,此时,合并区间的最大连续房间数只有三种情况:1、 左区间最大连续房间数2、 右区间最大连续房间数3、 左区间最大右连续房间数 + 右区间最大左连续房间数只要能够维护这些值,当中的更新和询问就好办了。代码:View Cod
阅读全文
摘要:题目描述:输入:U [1,5]D [3,3]S [2,4]C (1,5)I (2,3]输出:(2,3)解题思路:题意很明显,主要就是为了完成集合当中的并、交、差以及异或运算。仔细分析一下题目这五种运算:设T左右区间分别为l,rU T将(l,r)当中的所有点都置为1I T保留l,r中1的位置,将(-∞,l)(r,+ ∞)置为0D T将(l,r)当中全部置为0C T将(l,r)当中0,1互换,将(-∞,l)(r,+ ∞)置为0S T将(l,r)当中0,1互换至于开区间和闭区间的分别,可以用扩大总区间变为原来的两倍,用偶数来表示闭区间,基数来表示开区间。其实这个线段树题,我觉得最难的还是在取反的过程
阅读全文
摘要:题目描述:给定一个含有N个整数的序列,它们的下标从1到N,对该序列进行如下2种操作; 0 a b将下标为a的值变为b。 1 a b求下标[a,b]之间的最大连续和解题思路:每一段区间当中必须记录相应的值以便于更新,其中的值包括了该区间的最大左连续和、最大右连续和、最大连续和以及总和,如图分析:那么线段树此时从下往上更新的时候,合并区间时,那么对于此时我们要维护的区间最大连续和最多有三个值能够取,左区间最大连续和、右区间最大连续和、左区间的右最大连续和 + 右区间的左最大连续和,那么此时维护起来就特别的简单了。。代码如下:View Code 1 #include<iostream>
阅读全文

浙公网安备 33010602011771号