题目链接

题目

题目描述

给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值。

操作次数有Q次,每次操作需要将位子p处的数字变成y.

输入描述

本题包含多组输入,每组输入第一行一个数字n,表示序列的长度。

然后接下来一行输入n个数,表示原先序列的样子。

再接下来一行一个数字Q,表示需要进行的操作的次数。

最后Q行每行两个元素p,y,表示本操作需要将位子p处的数字变成y.

数据范围:

3<=n<=200000

1<=Q<=200000

-1000000000<=a[i]<=1000000000

输出描述

每组数据输出Q行,每行输出一个浮点数,保留两位小数,表示所求的最大值。

示例1

输入

5
2 4 6 8 10
2
2 5
4 9

输出

3.00
3.00

说明

第一次操作之后的序列变成:2 5 6 8 10

第二次操作之后的序列变成:2 5 6 9 10

备注

输入只有整形

题解

知识点:线段树,贪心。

一个巧妙的贪心,原式可以理解为两点的斜率,现在将点顺序画在坐标系上,注意到选择相邻两点的斜率一定比不相邻两点更优,因此我们直接考虑相邻两点的斜率即可。

相邻两点斜率就等于 \(a[j] - a[i]\) ,我们用线段树维护差分数组即可。

时间复杂度 \(O((n+m) \log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; struct T {
int mx;
static T e() { return { (int)-2e9 }; }
friend T operator+(const T &a, const T &b) { return { max(a.mx,b.mx) }; }
};
struct F {
int upd;
T operator()(const T &x) { return { upd }; }
}; template<class T, class F>
class SegmentTree {
int n;
vector<T> node; void update(int rt, int l, int r, int x, F f) {
if (r < x || x < l) return;
if (l == r) return node[rt] = f(node[rt]), void();
int mid = l + r >> 1;
update(rt << 1, l, mid, x, f);
update(rt << 1 | 1, mid + 1, r, x, f);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
} T query(int rt, int l, int r, int x, int y) {
if (r < x || y < l) return T::e();
if (x <= l && r <= y) return node[rt];
int mid = l + r >> 1;
return query(rt << 1, l, mid, x, y) + query(rt << 1 | 1, mid + 1, r, x, y);
} public:
SegmentTree(int _n = 0) { init(_n); }
SegmentTree(const vector<T> &src) { init(src); } void init(int _n) {
n = _n;
node.assign(n << 2, T::e());
}
void init(const vector<T> &src) {
assert(src.size() >= 2);
init(src.size() - 1);
function<void(int, int, int)> build = [&](int rt, int l, int r) {
if (l == r) return node[rt] = src[l], void();
int mid = l + r >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
};
build(1, 1, n);
} void update(int x, F f) { update(1, 1, n, x, f); } T query(int x, int y) { return query(1, 1, n, x, y); }
}; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
while (cin >> n) {
vector<int> a(n + 1);
for (int i = 1;i <= n;i++) cin >> a[i]; vector<T> a_src(n);
for (int i = 1;i <= n - 1;i++) a_src[i] = { a[i + 1] - a[i] };
SegmentTree<T, F> sgt(a_src); int m;
cin >> m;
while (m--) {
int p, y;
cin >> p >> y;
a[p] = y;
if (p >= 2) sgt.update(p - 1, { y - a[p - 1] });
if (p <= n - 1) sgt.update(p, { a[p + 1] - y });
cout << sgt.query(1, n - 1).mx << ".00" << '\n';
}
}
return 0;
}

NC14402 求最大值的更多相关文章

  1. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  2. HDU 2795 Billboard(区间求最大值的位置update的操作在query里做了)

    Billboard 通过这题,我知道了要活用线段树的思想,而不是拘泥于形式, 就比如这题 显然更新和查询放在一起很简单 但如果分开写 那么我觉得难度会大大增加 [题目链接]Billboard [题目类 ...

  3. c# 任意多个数,求最大值

    c#  任意多个数,求最大值 使用parms: 正在研究中,如果有好的方案,可评论,共同进步,共同提高,谢谢!

  4. 【c语言】求最大值

    一.我个人觉得求最大值比较简单的一种方法(当然同时求最大值和最小值时稍微改改也能行) #include <stdio.h> int main(void) { int f, i, max; ...

  5. zzuli求最大值

    1786: 求最大值 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 134  Solved: 28SubmitStatusWeb Board Desc ...

  6. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

  7. js求最大值最小值

    比较数组中数值的大小是比较常见的操作,比较大小的方法有多种,比如可以使用自带的sort()函数,代码如下: <html> <head> <meta charset=&qu ...

  8. java求最大值以及定义方法调用

    class ArrayDome { public static void main(String[] args) { int[] arr = {-12,-51,-12,-11}; int max = ...

  9. 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...

  10. elasticsearch聚合案例--分组、求最大值再求最大值的均值

    一.需求 A.B.C代表3个用户,第二列代表各自的得分,求A.B.C的最好成绩以及A.B.C最好成绩的均值 A 10 A 11 A 13 B 11 B 11 B 12 C 10 C 10 C 11 C ...

随机推荐

  1. spring--JDK动态代理和CGLIB代理的区别

    JDK 动态代理和 CGLIB 代理是 Java 中常用的两种动态代理实现方式,它们各有特点和适用场景: JDK 动态代理: JDK 动态代理是基于接口的代理方式,它使用 Java 反射机制来创建代理 ...

  2. 配置Maven项目的pom.xml时遇到input contained no data问题

    1.问题 2.解决 我发现每次当我修改一些部分之后,就会遇到这个问题 我遵循了他的建议重新排列标记属性,然后重新加载就解决了报错 个人怀疑是修改后并没有识别之类的? 最终原因:是我在Maven项目中的 ...

  3. html - 多次点击选中页面文字出现蓝色背景的解决方法

    body{ -moz-user-select: none; /*火狐*/ -webkit-user-select: none; /*webkit浏览器*/ -ms-user-select: none; ...

  4. bootstrap : 解决使图片全屏显示有空白边距的问题

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="utf-8 ...

  5. [转帖]在Linux中切换cmake版本

    在Linux中切换cmake版本https://blog.whsir.com/post-6804.html   在Linux系统中,有时需要使用cmake进行程序编译,由于不同的Linux系统导致安装 ...

  6. OB指定开源版本MySQL模式单节点安装

    OB指定开源版本MySQL模式单节点安装 yum源处理 yum install -y yum-utils yum-config-manager --add-repo https://mirrors.a ...

  7. [转帖]从小白到精通:揭秘perf工具的全部功能与操作技巧

    https://zhuanlan.zhihu.com/p/664396453 ​ 目录 收起 一.引言 二.理解perf工具的基本概念 三.安装与配置perf工具 3.1.不同操作系统的perf工具安 ...

  8. 不同数据库创建用户,数据库的SQL语句整理

    不同数据库创建用户,数据库的SQL语句整理 MySQL mysql -uroot -p # 输入密码登录数据库 CREATE DATABASE IF NOT EXISTS xxxdata_somein ...

  9. [转帖]可直接拿来用的kafka+prometheus+grafana监控告警配置

    kafka配置jmx_exporter 点击:https://github.com/prometheus/jmx_exporter,选择下面的jar包下载: 将下载好的这个agent jar包上传到k ...

  10. [转帖]TiKV集群搭建

    https://www.cnblogs.com/luohaixian/p/15227788.html 1.准备环境 准备4台ubuntu 16.04虚拟机 部署规划: 节点类型 CPU 内存 存储 部 ...