第六周训练总结

来源:互联网 发布:西安和沈阳知乎 编辑:程序博客网 时间:2024/05/21 06:41

前四天看了一下国庆专辑的题目,只出了E题。

这个题目要求求区间最值,区间最值其实和区间求和差不多,就是将sum数组的含义转移到max,然后通过特定的区间更新max

在区间求和中,当我们维护max[i]的时候,要找到它前面所有的max[j]来更新,画图可知,max[i]需要的max只有max[i-2^0],max[i-2^1],max[i-2^2]..max[i-lowbit(i)+1]。求区间最值时,很容易看出,我们找[l,r]的最值就是找在次区间的max,即递减r,在这里可以有个优化,即当找到一个max[i],有i-lowbit(i)>=l时,更新后,i直接-=lowbit(i),然后继续递减,当l>r就跳出循环。

A :因为操作中只有询问没有更新,可以对所有问按右区间升序排序。以该数字第一次在区间中出现的点代表所有的点。如果是第一次出现,那么该数字在之前从未出现或上一次出现不再区间内。记录每个位置i的数字的前一个相同数字出现的位置hash[i],没有前一个相同的hash[i]0。然后从前到后扫描询问,每次将上一个同值点的值加1,然后求当前区间的左界的前缀和就是答案了。将当前位置下个位置的值减1,这样做可以保证任意一个数字在任意一段区间中最多出现一次。但是一直都是超时...

后面几天做了树状数组和线段树的专题。

树状数组D题:

题意:

n个数,m次操作,Q表示询问n个数有多少顺序数,R a,b表示区间[a,b]中的数转动一下(a+1~b每个数向前移动,a位置的数到b位置).

思路:

如果每询问一次就求一次顺序数很费时间,先求出最初的顺序数ans,每转动一次时如果a+1~b位置的数大于a位置的数,ans--,如果小于a,ans++,那么就用到了数状数组求逆序数

树状数组F题:

题意:N*N*N的立方体,元素为0或1(初始为0)。1操作将(x1,y1,z1)到(x2,y2,z2)之间的元素取反;0操作是询问(x,y,z)为0或1。

题解:三维树状数组,原理跟一维,二维一样。

树状数组O题:

题意:

BLACK x y l是指将第x行,y列到第x+l-1行,y+l-1列翻成黑色(初始化时为白色)

WHITE x y l是指将第x行,y列到第x+l-1行,y+l-1列翻成白色(初始化时为白色)

TEST x y l是指求从第x行,y列到第x+l-1行,y+l-1列中白色的有几个。

 

解题思路:

  这个题目可以用树状数组来做,更新一个二维区间,查找一个二维区间两个函数,其中更新区间。

还看了看线段树中关于扫描线的知识,是之前看HDU 1828的问题了解的,本题求得是周长,所以将所有上下位边按y从小到大排序之后:
首先我们读入第一条扫描线(下位边+1),这条扫描线的长度直接加入ans结果中.
现在线段树整体就有两条竖向边了(平行于y轴的),所以这两条竖向边从第一条扫描线到第二条扫描线之间是会增涨的,所以总周长ans+=2*(第二条扫描线的高h2-第一条扫描线的高h1).
然后我们读入第二条扫描线(下位边+1):
由于我们更新完这条扫描线后,sum[1]覆盖的范围扩大了5,所以ans先加5.其次这个时候,我们的竖向边由两条变成了3,所以ans+=3*(扫描线3的高度h3-扫描线2的高度h2).
然后我们读入第三条扫描线(上位边-1):

由于我们读入该扫描线后sum[1]的覆盖值少了5,但是此时我们看图知道其实这个矩形的另一条上边了.所以我们不能用ans+=sum[1],我要执行ans+=abs(last-sum[1]),其中last是上一轮读入扫描线后sum[1]的值。

 

 

 

 

 

原创粉丝点击