【UOJ 测试】C. 【#246 UER #7】套路(乱搞+枚举)

2023-10-04 22:40

本文主要是介绍【UOJ 测试】C. 【#246 UER #7】套路(乱搞+枚举),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C. 【UER #7】套路




反攻正在进行中,按照套路,跳蚤国将会很快获得最终的胜利。跳蚤国的情报局也没闲下来,他们正打算派遣一批“菲克蚤”前往跳晚国窃取有关三星 note7 的资料。

Fake Yang 是这批“菲克蚤”的教练,他教会他们各种 Fake 的技术,以便更好混入敌方内部。共  n n 只菲克蚤,由  1 1 到  n n 编号。Fake Yang 给每个菲克蚤都算了特征值  a1,,an a1,…,an,两个菲克蚤的相似度定义成这两个菲克蚤的特征值的差的绝对值,即第  i i 只菲克蚤与第  j j 只菲克蚤的相似度为  aiaj ∣ai−aj∣

现在这批菲克蚤排成一列在 Fake Yang 面前,Fake Yang 需要在其中选出一些菲克蚤合成一个行动小队。按照套路,他会选取连续一整段的菲克蚤  al,al+1,,ar al,al+1,…,ar。很显然,这个行动小队越大越好,但是按照套路,小队内的跳蚤最好都各不相同,假如有两只跳蚤长得很像的话很可能会引起跳晚们的怀疑。为此 Fake Yang 将小队的相似度定义为小队中的跳蚤两两之间的最小的相似度,用  s(l,r) s(l,r) 表示。

为保证安全,现在他想选取至少  k k 只跳蚤,且使得安全值最大。其中安全值定义如下:

但是,他并不知道最优解是什么,于是按照套路你需要帮助他求得这个值。

输入格式

按照套路,第一行三个正整数  n,m,k n,m,k k k 的意义如前所述, n n 表示跳蚤的只数。

接下来一行  n n 个整数,按照套路依次表示  n n 只跳蚤的特征值  a1,,an a1,…,an,保证  1aim 1≤ai≤m

输出格式

按照套路,一行一个整数,表示答案。

样例一

input
10 10 2
1 4 2 6 1 9 6 8 10 3
output
8
explanation

一种方案是选取区间[5,6],相似度为8,那么答案为(6-5)×8=8

限制与约定

由于一些原因,本题我们需要按照套路使用捆绑测试。每个子任务有若干个测试点,分为  5 5 个子任务,你只有通过一个子任务的所有测试点才能按照套路得到这个子任务的分数。

【题解】

【分成两部分来搞,然而为什么???窝不知道,感性的理解下伐。ATP和zyf说:不分开搞怎么保证时间复杂度。。。(好伐,貌似好有道理诶!)】

【题解上说:

【PART 1】【考虑k<=S的情况,一部分近乎暴力,i枚举的是有多少个跳蚤包含在小组里,j枚举的是当前小组的起点,每次用小组的最后一个元素减去第一个元素并与当前小组的最小差比较、更新(因为i从2开始枚举,前面的数之间的差都已经算过)】

【PART 2】【这一段是固定右边界和最小差值,寻找左边界,i枚举右边界,j枚举最小差值j+1。每次用已固定的右边界的值上下浮动j,查找最大区间 】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define S 500
using namespace std;
int a[200010],n,m,k,ans;
int r[200010],f[200010],l[200010];
inline int abss(int x)
{if(x>=0) return x;return -x;
}
int main()
{int i,j;scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;++i) scanf("%d",&a[i]);memset(f,127,sizeof(f));for(i=2;i<=S;++i)for(j=1;j+i-1<=n;++j){int x=abss(a[i+j-1]-a[j]);f[j]=(f[j]<f[j+1]?f[j]:f[j+1]); f[j]=(f[j]<x?f[j]:x);if(i>=k) ans=max(ans,f[j]*(i-1));}//PART 1int N=(k>S?k:S);for(i=1;i<=n;++i){for(j=0;j<=S;++j){int x=(j==0?0:l[j-1]);l[j]=(l[j]>x?l[j]:x);if(a[i]-j>=1) l[j]=(l[j]<r[a[i]-j]?r[a[i]-j]:l[j]);if(a[i]+j<=m) l[j]=(l[j]<r[a[i]+j]?r[a[i]+j]:l[j]);if(i-l[j]>=N) ans=max(ans,(i-l[j]-1)*(j+1));}r[a[i]]=i;//因为在超过N的区间大小里可能有重复元素,所以要每次尽量将最右端右移,这样可以使下一次枚举区间时满足条件的区间尽量大 } //PART 2 printf("%d\n",ans);return 0;
}


这篇关于【UOJ 测试】C. 【#246 UER #7】套路(乱搞+枚举)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚