7038 -- 【11.18测试】t4

2024-03-14 14:10
文章标签 测试 t4 11.18 7038

本文主要是介绍7038 -- 【11.18测试】t4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

7038 – t4

这不是跳舞增强版吗

考虑把原来两种做法优化

分治

单组询问分治,对于每一层处理经过当前层mid的区间贡献
预处理[l,mid]的后缀min和max,枚举右端点,对于[mid+1,r]的min和max是确定的,分类讨论拼起来的区间的min和max在哪一边

发现对于min和max都各有一个分界点k
∀ i ∈ [ k , m i d ] , m i n [ i , r ] = m i n [ m i d + 1 , r ] \forall i\in[k,mid],min[i,r]=min[mid+1,r] i[k,mid]min[i,r]=min[mid+1,r]
∀ i ∈ [ l , k − 1 ] , m i n [ i , r ] = m i n [ i , m i d ] \forall i\in[l,k-1], min[i,r]=min[i,mid] i[l,k1],min[i,r]=min[i,mid]
然后发现二者的分界点把[l,mid]分成了三部分
在这里插入图片描述
对于第一部分, a n s = ∑ m i n ⋅ m a x ans=\sum min\cdot max ans=minmax
对于第二部分, a n s = m i n R ⋅ ∑ m a x 或 m a x R ⋅ m i n ans=minR\cdot\sum max 或maxR\cdot min ans=minRmaxmaxRmin
对于第三部分, a n s = m i n R ⋅ m i n L ⋅ l e n ans=minR\cdot minL\cdot len ans=minRminLlen
所以分别预处理四者的后缀和即可


考虑扩展到多组询问,先离线询问,然后还是分治做法,先处理经过当前中点的区间的贡献,再递归下去解决(相当于把一个询问区间拆成log段)

对于一个区间[x,y],在处理[l,r]时已经处理了经过mid的贡献,所以只需要再分别考虑[x,mid]和[mid+1,y]的贡献即可

对于区间[l,r],还是预处理4个后缀和,枚举右端点然后用线段树去维护总和。先对节点预处理区间和num,每次分成3段区间打add标记,表示sum(贡献)+=add*num,然后维护区间和。询问按右端点排序,枚举到当前右端点时更新ans= ∑ \sum t[0/1/2/3].query(l,mid)

线段树

还是先离线询问,枚举右端点,考虑暴力就是用两个数组mn,mx去表示[l,r]的min和max,每次r++时更新数组

考虑用线段树去优化这个过程,用单调栈(存下标)去维护,每次先弹栈,再把[q[top]+1,r]这段区间的mn数组改成a[i],每个a[i]只会进一次出一次,维护区间min/max覆盖标记和区间答案

然后如果把不同的r对应的mn数组看成是mn数组的不同版本(r=1就是版本1,r=2就是版本2)
那么询问L,R,其实就是对[L,R]的每个版本询问[L,R]的和

然后就变成了维护历史和的一个操作
并没有想到覆盖标记怎么搞,先把覆盖标记转化成加标记,每次弹栈的时候把对应区间减去a[q[top]],最后再把[q[top]+1,r]加上a[i]

然后考虑维护几个标记,首先是mn和mx的加标记
m x = m x + a , m n = m n + b mx = mx+a, mn = mn+b mx=mx+a,mn=mn+b
∑ m x = ∑ m x + a ⋅ s z \sum mx=\sum mx+a\cdot sz mx=mx+asz
∑ m n = ∑ m n + b ⋅ s z \sum mn=\sum mn+b\cdot sz mn=mn+bsz
∑ m x ⋅ m n = ∑ ( m x + a ) ( m n + b ) = ∑ m x ⋅ m n + a ∑ m n + b ∑ m x + a b ⋅ s z \sum mx\cdot mn = \sum (mx+a)(mn+b)=\sum mx\cdot mn+a\sum mn+b\sum mx+ab\cdot sz mxmn=(mx+a)(mn+b)=mxmn+amn+bmx+absz

然后是更新s(历史和)的标记
s = s + c ∑ m x ⋅ m n s=s+c\sum mx\cdot mn s=s+cmxmn

问题是在合并标记的时,会发现标记不够用
在这里插入图片描述
后面那一堆东西没办法只用一个c表示出来

所以维护c,d,e,f表示 s = s + c ∑ m x m n + d ∑ m n + e ∑ m x + f ⋅ s z s=s+c\sum mxmn+d\sum mn+e\sum mx+f\cdot sz s=s+cmxmn+dmn+emx+fsz
然后是标记合并:在这里插入图片描述

对mx加就打(k,0,0,0,0,0)的标记
对mn加就打(0,k,0,0,0,0)的标记
每次更新完打(0,0,1,0,0,0)的标记表示更新历史和

这篇关于7038 -- 【11.18测试】t4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808671

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前后端吗? 有必要。本文从三个方面论述。分别是可测试,可维护,可移植。 可测试 软件黑盒测试更普遍,但很难覆盖所有应用场景。于是有了接口测试、模块化测试以及单元测试。都是通过降低测试对象

day45-测试平台搭建之前端vue学习-基础4

目录 一、生命周期         1.1.概念         1.2.常用的生命周期钩子         1.3.关于销毁Vue实例         1.4.原理​编辑         1.5.代码 二、非单文件组件         2.1.组件         2.2.使用组件的三大步骤         2.3.注意点         2.4.关于VueComponen

如何成为一个优秀的测试工程师

链接地址:http://blog.csdn.net/KerryZhu/article/details/5250504 我一直在想,如何将自己的测试团队打造成世界一流的团队?流程、测试自动化、创新、扁平式管理、国际标准制定、测试社区贡献、…… 但首先一点是明确的,就是要将每一个测试工程师打造成优秀的测试工程师,优秀的团队必须由优秀的成员构成。所以,先讨论“如何成为一个优秀的测试工程师”,