Codeforces Round 890 (Div. 2) C. To Become Max(二分 补写法 二分套二分)

news2024/11/22 16:12:02

题目

给定一个长度为n(n<=1e3)的数组,

在一次操作里,你可以选择一个满足a[i]<=a[i+1]的下标i(1<=i<=n-1),对a[i]加一

问,你最多操作k次的情况下,数组的最大值是多少,输出最大值

思路来源

Submission #217368352 - Codeforces

题解

这题是n=1e3的,正常的写法O(n^2logv)的写法很多,对于每个值,二分其最大答案

比如我赛中的提交,Submission #217328890 - Codeforces

Bonus

这里给出一种n=1e5的做法,O(nlognlogv)

Hint

以样例里最具代表性的case为例,

n=5,k=6

6 5 4 1 5

可以令a[4]+3,然后令a[3]+1,令a[2]+1,令a[1]+1,最后答案是7

最终序列是形如7 6 5 4 5,记做A数组,

而7 6 5 4是我们取得的一段,记做A[l,r],

显然,需要满足,

①:A[r]>=a[r+1]-1

即所取区间的最后一个值,大于等于初始序列下一个位置的值减1,不然无法拔高a[r]

②:此外,A序列最终答案[l,r]还一定是一段连续的、后项=前项-1的区间,

所以,这启发我们先给a[i]用初值拉齐,构造b[i]=a[i]-(n-i)

a: 6 5 4 1 5

b: 1 1 1 -1 4

终态数组

这里用A、B,和初始a、b区分

A: 7 6 5 4 5

B: 2 2 2 2 4

最终我们取的B区间是[2,2,2,2],

观察①限制,发现在新数组中,等价于B[r]<=b[r+1]

贪心最小代价时,需要找到[i,n]里满足>=B[r]的最左位置

而2就是最终的取值v(v=B[l]=...=B[r]),被还原回去,w=v+(n-i),也就是7

Solution

1. 根据a序列,构造新序列b[i]=a[i]-(n-i)

2. ST表预处理出b[i]的区间最大值,预处理b[i]的前缀和

3. 二分最终答案w,w在B序列里考虑时,B[i]=w-(n-i)

4. 通过ST表+二分,找到满足b[j]>=B[i]的最小的j(j>=i),

也就意味着,[i,j)这一段都是<B[i]的,都需要被拔高,利用前缀和,判断k次机会,是否可满足

代码

// #include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,ll> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=1e5+10,M=20,INF=0x3f3f3f3f;
int t,n,k,a[N],b[N],mx[N][M],lg[N];
ll sum[N];
void init(){
    for(int i=2;i<N;++i){
        lg[i]=lg[i>>1]+1;
    }
}
//最大值的最左位置
void ST(int n){
    for(int i=1;i<=n;++i)mx[i][0]=b[i];
	for(int len=1;(1<<len)<=n;++len){
		for(int i=1;i+(1<<len)-1<=n;++i){
			mx[i][len]=max(mx[i][len-1],mx[i+(1<<(len-1))][len-1]);
		}
	}
}
int RMQ(int l,int r){
	int k=lg[r-l+1];
    return max(mx[l][k],mx[r-(1<<k)+1][k]);
}
ll cal(int l,int r){
    return sum[r]-sum[l-1];
}
bool ok(int v){
    rep(i,1,n-1){
        int w=v-(n-i),p=RMQ(i+1,n);//[2,2,2,>=2] [i,p] b[l]=b[l+1]=...=b[p-1]<=b[p] [i,p-1)拔高,p不变
        if(p<w)continue;
        int l=i+1,r=n;//>=w的最左位置
        while(l<=r){
            int mid=(l+r)/2;
            if(RMQ(i+1,mid)>=w)r=mid-1;
            else l=mid+1;
        }
        if(cal(i,l-1)+k>=1ll*(l-i)*w){
            return 1;
        }
    }
    return 0;
}
int sol(){
	int ans=0;
	rep(i,1,n){
        ans=max(ans,a[i]);
        b[i]=a[i]-(n-i);
        sum[i]=sum[i-1]+b[i];
    }
    ST(n);
    int l=ans+1,r=ans+k;
    while(l<=r){
        int mid=(l+r)/2;
        if(ok(mid))l=mid+1;
        else r=mid-1;
    }
	return r;
}
int main(){
    init();
	sci(t);
	rep(j,1,t){
		sci(n),sci(k);
		rep(i,1,n)sci(a[i]);
        pte(sol());
	}
	return 0;
}
/*
3
31 1
99999997 99999997 99999997 99999997 99999997 99999999 100000000 99999999 100000000 100000000 99999998 99999999 100000000 99999997 99999998 99999998 99999999 100000000 99999998 100000000 99999998 100000000 99999997 99999997 99999997 99999998 100000000 99999997 99999998 99999997 100000000
*/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++精华铺】5.C++类和对象(中)类的六个默认成员函数

目录 1. 六个默认成员函数 2. 构造函数 2.1 概念 2.2 默认构造 2.2.1 系统生成的默认构造 2.2.2 自定义默认构造函数 2.3 构造函数的重载 3. 析构函数 3.1 概念 3.2 系统生成的析构函数 3.3 自定义析构函数 4. 拷贝构造 4.1 概念 4.2 默认生成的拷贝构造&#xff08;浅…

解锁滴滴ES的性能潜力:JDK 17和ZGC的升级之路

前文介绍了滴滴自研的ES强一致性多活是如何实现的&#xff0c;其中也提到为了提升查询性能和解决查询毛刺问题&#xff0c;滴滴ES原地升级JDK17和ZGC&#xff0c;在这个过程中我们遇到了哪些问题&#xff0c;怎样解决的&#xff0c;以及最终上线效果如何&#xff0c;这篇文章就…

云计算技术——多GPU渲染的云渲染服务

多GPU渲染的云渲染服务&#xff0c;是一种利用云计算技术&#xff0c;将多个图形处理器&#xff08;GPU&#xff09;集成在一起&#xff0c;为用户提供高效、便捷、低成本的渲染解决方案的服务。本文将从多GPU渲染的概念、优势、应用场景&#xff0c;云渲染服务的特点、优势&am…

【C++】初阶 --- 内联函数(inline)

文章目录 &#x1f95e;内联函数&#x1f35f;1、C语言实现"宏函数"&#x1f35f;2、内联函数的概念&#x1f35f;3、内联函数的特性&#x1f35f;4、总结 &#x1f95e;内联函数 &#x1f35f;1、C语言实现"宏函数" &#x1f970;用C语言先来实现普通的…

并发——volatile 关键字

文章目录 1. CPU 缓存模型2. 讲一下 JMM(Java 内存模型)3. 并发编程的三个重要特性4. 说说 synchronized 关键字和 volatile 关键字的区别 我们先要从 CPU 缓存模型 说起&#xff01; 1. CPU 缓存模型 为什么要弄一个 CPU 高速缓存呢&#xff1f; 类比我们开发网站后台系统使…

分布式 - 服务器Nginx:一小时入门系列之静态网页配置

文章目录 1. 静态文件配置2. nginx listen 命令解析3. nginx server_name 命令解析4. nginx server 端口重复5. nginx location 命令 1. 静态文件配置 在 /home 文件下配置一个静态的AdminLTE后台管理系统&#xff1a; [rootnginx-dev conf.d]# cd /home [rootnginx-dev home…

flutter项目给安卓打正式包 和升级版本号

1.首先把flutter项目里的android目录整个拖进android studo里,运行一下看看是否能运行 2.Build->Generate Signed Bundle/APK… 点击APK->Next 如果没有key酒店及Create new…就生成新的key 点击Key store path:右边的图标选择保存路径 选择保存的路径,并且在Save…

【雕爷学编程】Arduino动手做(01)---干簧管传感器模块4

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

logo一键生成的操作,没有设计经验也无妨

您可能会担心&#xff0c;没有设计经验如何设计一个独特而专业的标志&#xff08;Logo&#xff09;。但是&#xff0c;随着技术的进步&#xff0c;现在有许多一键生成操作的设计工具可供使用&#xff0c;使人们更容易创建自己的Logo。 什么是一键生成操作&#xff1f; 一键生成…

若依vue -【 100 ~ 更 】

100 主子表代码生成详解 1 新建数据库表结构&#xff08;主子表&#xff09; -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

《大型网站技术架构》第二篇 架构-高可用

高可用在公司中的重要性 对公司而言&#xff0c;可用性关系网站的生死存亡。对个人而言&#xff0c;可用性关系到自己的绩效升迁。 工程师对架构做了许多优化、对代码做了很多重构&#xff0c;对性能、扩展性、伸缩性做了很多改善&#xff0c;但别人未必能直观地感受到&#…

字节编码学习

字节编码学习 文章目录 字节编码学习01_字节与ASCII码表02_每个国家都有独特的码表03_国际化UTF-804_编码本和解码本不一致&#xff0c;乱码 01_字节与ASCII码表 public class Demo01 {public static void main(String[] args) {// 计算机的底层全部都是字节 ---- ----// 一个…

Android Studio实现简单ListView

效果图 MainActivity package com.example.listviewtest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.widget.ListView;import com.example.listviewtest.adapter.PartAdapter; import com.example.listviewtest.bean.PartB…

多目标优化之MOEA-D算法,MATLAB代码,免费获取

今天给大家分享一期MOEA/D算法。1 引言 基于分解的多目标进化算法(MOEA/D)的核心思想将多目标优化问题被转化为一系列单目标优化子问题或者是多个多目标的子问题&#xff0c;然后利用子问题之间的邻域关系&#xff0c;采用协作的方式对这些子问题同时进行优化。从而向整个Paret…

大麦订单截图 一键生成订单截图

新版付款图样式展示 这个样式图就是在大麦刚付款完的一个订单截图&#xff0c;它的状态是等待卖家发货 下滑下载源码 下载源码&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

LoRaWAN网关与网络服务器(NS)的通信LNS协议介绍

将 LoRaWAN网关连接到 LoRaWAN 网络服务器 (LNS) 是一个两步过程,该过程使用 WebSocket 作为传输协议来交换包含 JSON 编码对象的文本记录。 首先,网关向LNS查询LNS实际连接端点的URI。其次,它与该端点建立数据连接以接收设置信息。从那时起,LoRa 上行链路和下行链路帧通过…

golang专栏

GOLANG专栏订阅会员 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教…

校园防欺凌防霸凌该怎么做

校园防欺凌防霸凌该怎么做 校园防欺凌和霸凌是一个长期而全面的过程&#xff0c;需要学生、教师和家长共同参与和努力。以下是一些可以采取的措施&#xff1a; 1. 教育和意识提高&#xff1a;通过教育和培训&#xff0c;提高学生、教师和家长对欺凌和霸凌的认识和了解。学校可…

机器人制作开源方案 | 超市服务机器人

作者&#xff1a;林江斌 岳沛霖 李锦扬 单位&#xff1a;北京理工大学 机械与车辆学院 指导老师&#xff1a;李忠新 朱杰 一、作品简介 1.设计背景 当前社会疫情防控已经成为常态化&#xff0c;超市是人员流动相对密集的公共场所&#xff0c;超市防疫也是社会防疫工作中重要…

linuxARM裸机学习笔记(4)----GPIO中断以及定时器中断实验

1.中断向量表 这个表里面存放的都是中断向量&#xff0c;中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量。中断向量表是一系列中断服务程序入口地址组成的表&#xff0c;当某个中断触发的时候会自动跳转到中断向量表对应的中断服务程序的入口。 2.NVIC(内嵌向…