UER #7

news/2024/10/9 10:10:46/文章来源:https://www.cnblogs.com/yaosicheng124/p/18453645

B. 天路

题目描述

在一根数轴上,有 \(N\) 个点 \(A_1,A_2,\dots,A_N\),你要对于 \(\forall 2\le k\le N\),求出 \(\min\limits_{1\le l\le N-k+1} \{\max \limits_{l\le i< j\le l+k-1}\{|A_i-A_j|\}\}\)

如果对于每个 \(k\),你输出的答案 \(c_k\) 与标准答案 \(\widehat{c_k}\) 的相对误差不超过 \(\% 5\),即 \(|c_k-\widehat{c_k}|\le \widehat{c_k}\cdot \% 5\),那么你的答案将会被接受。

思路

注意到这里允许你的答案有 \(\% 5\) 的误差,所以考虑枚举答案,并求出对应的 \(k\)。由于这里的答案不超过 \(10^6\),并且每次枚举答案 \(x\) 可以直接令 \(x\leftarrow \max(x+1,1.05\cdot x)\),所以只需枚举 \(\log_{1.05} 10^6 \approx 300\) 次。

那么怎么求出 \(k\) 呢?我们用双指针求出能够覆盖的极大区间,使用单调队列维护区间最大/小值即可。

空间复杂度 \(O(N)\),时间复杂度 \(O(N\log_{1.05} V)\),其中 \(V=10^6\)

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 100001, MAXV = 1000001;int n, a[MAXN], que[2][MAXN], head[2], tail[2], ans[MAXN];int Solve(int x) {head[0] = head[1] = 1;tail[0] = tail[1] = 0;int ret = 0;for(int i = 1, j = 0; i <= n; ++i) {for(; j <= n && (head[0] > tail[0] || head[1] > tail[1] || a[que[0][head[0]]] - a[que[1][head[1]]] <= x); ) {if(++j <= n) {for(; head[0] <= tail[0] && a[que[0][tail[0]]] <= a[j]; tail[0]--) {}que[0][++tail[0]] = j;for(; head[1] <= tail[1] && a[que[1][tail[1]]] >= a[j]; tail[1]--) {}que[1][++tail[1]] = j;}}ret = max(ret, j - i);for(; head[0] <= tail[0] && que[0][head[0]] <= i; head[0]++) {}for(; head[1] <= tail[1] && que[1][head[1]] <= i; head[1]++) {}}return ret;
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; ++i) {cin >> a[i];ans[i] = int(1e9) + 1;}for(int i = 0; i < 2000000; i = max(i + 1, (int)(1.05l * i))) {int x = Solve(i);ans[x] = min(ans[x], i);}for(int i = n - 1; i >= 2; --i) {ans[i] = min(ans[i], ans[i + 1]);}for(int i = 2; i <= n; ++i) {cout << ans[i] << "\n";}return 0;
}

C. 套路

题目描述

有一个数列 \(A_1,A_2,\dots,A_N(1\le A_i\le M)\)。令 \(s(l,r)=\min\limits_{l\le i<j\le r}\{|A_i-A_j|\}\),你要求出 \(\max\limits_{1\le l+k-1\le r\le N}\{(r-l)\cdot s(l,r)\}\)

思路

由于 \(s(l,r)\le \frac{M-1}{r-l}\),所以可以想到根号分治。

对于 \(s(l,r)\le \sqrt M\),我们从小到大枚举 \(s(l,r)\)。我们令 \(lst_{i}\) 为最大的 \(j\) 使得 \(|A_i-A_j|<s(l,r)\)。一开始 \(s(l,r)=1\),那么 \(lst_i\) 就是上次 \(A_i\) 出现的位置,可以轻松求出。后来每次 \(s(l,r)\) 加一,只需将 \(lst_i\)\(A_i-s(l,r)+1,A_i+s(l,r)-1\) 出现的位置去 \(\max\) 即可。接着双指针,用单调队列维护区间 \(lst_i\) 最大值即可。

对于 \(s(l,r)>\sqrt M\),那么 \(r-l+1\le \sqrt M\),所以我们可以使用区间 dp,令 \(dp_{i,l}\) 表示区间长度为 \(i\),左端点为 \(l\) 时的 \(s(i,l)\)。很明显有转移 \(dp_{i,l}=\min(dp_{i-1,l},dp_{i-1,l+1},|A_l-A_{l+i-1}|)\)。这里可以用降维优化。

空间复杂度 \(O(N+M)\),时间复杂度 \(O((N+M)\sqrt M)\)

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;const int MAXN = 200001, B = 447;int n, m, k, a[MAXN], pos[MAXN], lst[MAXN], que[MAXN], head, tail, dp[MAXN];
ll ans;int Solve(int x) {fill(pos + 1, pos + m + 1, 0);int ret = 0;for(int i = 1; i <= n; ++i) {lst[i] = max({lst[i], (a[i] - x + 1 >= 1 ? pos[a[i] - x + 1] : 0), (a[i] + x - 1 <= m ? pos[a[i] + x - 1] : 0)});pos[a[i]] = i;}head = 1, tail = 0;for(int i = 1, j = 0; i <= n; ++i) {for(; j <= n && (head > tail || lst[que[head]] < i); ) {if(++j <= n) {for(; head <= tail && lst[que[tail]] <= lst[j]; --tail) {}que[++tail] = j;}}ret = max(ret, j - i - 1);}return ret;
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> m >> k;for(int i = 1; i <= n; ++i) {cin >> a[i];dp[i] = MAXN;}ll A = 0, b = 0;for(int i = 1; i <= min(m, (MAXN - 1 + B - 1) / B); ++i) {ll x = Solve(i);if(x + 1 >= k) {ans = max(ans, 1ll * x * i);A = max(A, 1ll * x * i);}}for(int i = 2; i <= min(n, B); ++i) {for(int l = 1, r = i; r <= n; ++l, ++r) {dp[l] = min({dp[l], abs(a[l] - a[r]), dp[l + 1]});if(i >= k) {ans = max(ans, 1ll * (i - 1) * dp[l]);b = max(b, 1ll * dp[l] * (i - 1));}}}cout << ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/810415.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix“专家坐诊”第258期问答

问题一 Q:各位大神 问下这个zabbix通知到企业微信的py脚本可以使吗? A: 这个需要自行测试。 Q:用jconsole连接失败了。 A:那就是没配好, 连接不上,要确保能正常远程连接。问题二 Q:这种是虚拟机内部的jmx配置有问题吗? A:提示被拒绝了,没成功连上,jmx 的要用先测…

图片转绘画效和绘画软件

我收藏的软件:绘画软件: ArtRage Krita 图片转绘画效: Snap Art 4 Impresso Proffffffffffffffffftest red font.

Java反序列化

Java反序列化 什么是序列化和反序列化 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。序列化:将数据结构或对象转换成二进制字节流的过程 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或…

QT5中引入GMSSL库

近来项目中需要使用加密算法,对上/下位机之间的消息进行加密。客户要求使用国密算法库,不能使用国际上通用的AES、RSA等算法。 国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 其中SM1没有开源,其他的均开源。 源码编译 开源…

Day2 备战CCF-CSP练习

201403-3Day2 题目描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。 每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。 这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。 在工具名字之后可能会包含若干…

oop实验1

task1:1 // 现代C++标准库、算法库体验2 // 本例用到以下内容:3 // 1. 字符串string, 动态数组容器类vector、迭代器4 // 2. 算法库:反转元素次序、旋转元素5 // 3. 函数模板、const引用作为形参6 7 #include <iostream>8 #include <string>9 #include <vector…

MySQL 官宣:支持读写分离了!!

我们一直在等待的 MySQL 读/写分离功能 现在终于可以使用了! 在规模上,我们在副本之间分配读取,但这必须在应用程序中以某种方式进行管理:指向在某个地方写入并在其他地方读取。 在 MySQL 8.2 中,MySQL Router 现在能够识别读取和写入,并将它们路由到主实例(如果是 Inno…

【一步步开发AI运动小程序】二十、AI运动小程序如何适配相机全屏模式?

引言 受小程序camera组件预览和抽帧图像不一致的特性影响,一直未全功能支持全屏模式,详见本系列文件第四节小程序如何抽帧;随着插件在云上赛事、健身锻炼、AI体测、AR互动场景的深入应用,各开发者迫切的希望能在全屏模式下应用,以便获得更合理的UI布局和更佳的用户体验,经…

实战逆向RUST语言程序

实战为主,近日2024年羊城杯出了一道Rust编写的题目,这里将会以此题目为例,演示Rust逆向该如何去做。关于Rust逆向,其实就是看汇编,考验选手的基础逆向能力。在汇编代码面前,任何干扰都会成为摆设。实战为主,近日2024年羊城杯出了一道Rust编写的题目,这里将会以此题目为…

AI课堂教学质量评估系统

AI课堂教学质量评估系统利用摄像头和人脸识别技术,AI课堂教学质量评估系统实时监测学生的上课表情和课堂行为。同时,系统还结合语音识别技术和听课专注度分析算法,对学生的听课专注度进行评估。AI课堂教学质量评估系统通过收集和分析这些数据,生成教学质量报告,并提供针对…

在线表格技术如何助力企业实现全面预算?

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/前言 在当今快速变化和竞争激烈的商业环境中,企业需要通过精细化的管理手段来确保自身的市场竞争力和持续发展。全面预算管理(Comprehensive Budget Management)作为企业管理的重要组成部分,不仅为企业的…

考场作弊行为自动抓拍告警系统

考场作弊行为自动抓拍告警系统通过在考场内部布设监控摄像头和智能识别设备,考场作弊行为自动抓拍告警系统实时监测考场内所有考生的行为,考场作弊行为自动抓拍告警系统利用图像识别技术,对考生的行为进行自动抓拍,并分析判断是否存在作弊行为。考场作弊行为自动抓拍告警系…