第六周训练总结
来源:互联网 发布:西安和沈阳知乎 编辑:程序博客网 时间: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]的值。
- 第六周训练总结
- 第六场训练赛总结
- 第六周项目训练1
- 2015第六届山东省赛训练总结2017/4/29
- 第六周总结
- 第六周总结
- 第六周总结
- 第六周总结
- 【考研】第六周总结
- 第六大周总结
- 周训练总结 0.11
- 训练第六天
- FOUR组第六周总结
- 【实训】第六周总结上
- 【实训】第六周总结下
- 启明星第六周学习总结
- 第六周项目训练2带武器的角色类
- 第六周项目训练3 IP地址类
- 数据库
- Hive优化之小文件问题及其解决方案
- 起航
- 判断程序是横屏竖屏的表达式
- 支付宝小程序申请-制作-打包-上线完整流程汇总
- 第六周训练总结
- (M)Dynamic Programming:139. Word Break
- Hive严格模式
- Java中间变量缓存机制的理解
- spring配置文件最全面的详解
- HTTP状态码表示HTTP协议所返回的响应的状态
- 10月8日训练笔记
- 增删改查的核心
- 通过 命令提示符(cmd.exe)连接 Oracle 数据库