当前位置: 首页 > news >正文

D. Empty Graph #813 div2

Problem - D - Codeforces

题意是给你一组序列,编号1,2,3对应着点的编号,根据这个序列创建一个无向有权图。然后从点a到点b的权值就是对应在这个序列里面的[a,b]的最小值,然后找到所有从一个点到另外的一个点的最短路的权值最大。

可以有不超过k次的操作:选择一个任意索引,使得a[i]=x(x∈[1,1e9])

贪心 二分都可以写

下面我说贪心的思路

这题你要从图里面发现很多性质才可以把这个题写掉

首先:图的最大权值必然是相邻的点的最小值,即min(a[i],a[i+1])

证明:点al到ar的权值为[l,r]的最小权值,你在一个数组里面有个值最小,因为有这个值的存在,包含这个点的所有区间对应到所有的点的权值都是那个最小的数,为了方便起见,这个值也就是相邻的点的权值,整体上来看最大的权值必然是某个相邻的点的权值

第二:这个题的本质是从a到b的最短路的最大值

a到b可以有两种走法:这里定义一个最小值ax(在x的位置上)

①:a->b,这种情况在区间[a,b]上面没有这个ax,也就是没有整体的这一个最小值。就是a直接到b,这个遍历一遍就好,取路上的最小权值然后取max

②:a->x->b,在这一段路径上包含了ax,也就是最小值在这个区间上面,那这个a到b的权值也就是先可以a到x,然后x到b,所以这种情况的权值就是ax*2

好,上面是两种可能的走法,如果k==0,那上面的就是答案了。

现在开始使用k,就开始依据上面然后基于贪心的思想,开始进行最小值的最大化

根据上面的第一种情况的表达式:maxn=max(maxn,min(a[i],a[i+1])

第二种情况是尽可能的把最小值变大,然后ax*2

一个是线性一个是平方,所以首选的是第二种:让最小值尽可能的变大

怎么变大?就是把前k-1小的数变成正无穷,然后第k个数理应就是变化后的最小值

刚刚说到前k-1小的数,把k-1次都留在操作最小值,然后第k次有两种选择:

要么是继续操作最小值,要么是增加a->b,这里操作一次,也就是增加一次即可(第一种操作),多了没意义,反正都是取两者的最小值。就是取两者种的最小值,无论怎么变化,我们都可以把其中一个权值变成无穷大,然后取最大权值的那个就好

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define IOS ios::sync_with_stdio(false), cin.tie(0);
#include<iostream>
#include<map>
#include<set> 
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
#define int long long
typedef long long LL;
typedef pair<int,int> PAII;
const int N=2e6+10,M=5050,INF=1e9,mod=1e9+7;
int a[N],b[N];
signed main(){
    //IOS;
    int T;
    //T=1;
    cin>>T;
    while(T--)
    {	
		priority_queue<PAII,vector<PAII>,greater<PAII>> q;
		int n,k;
		cin>>n>>k;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			q.push({a[i],i});
		}
		for(int i=1;i<=k-1;i++)//这里操作k-1次 
		{
			auto t=q.top();
			q.pop();
			int pos=t.second;
			q.push({INF,pos});
			a[pos]=INF;
		}
		for(int i=1;i<=n;i++) b[i]=a[i];//b数组留最后一次操作过程量 
		auto t=q.top();
		q.pop();
		int p1=t.second;
		q.push({INF,p1});
		a[p1]=INF;//a数组继续操作最小值 
		int maxn=-1e18;
		for(int i=1;i<=n-1;i++) maxn=max(maxn,min(a[i],a[i+1]));
		sort(a+1,a+n+1);
		int res1=min(a[1]*2,maxn);
		sort(b+1,b+n+1);
		int res2=min(b[1]*2,b[n]);
		//这里b是把其中的一个变大,不管怎么样都是可以取到最大权值,所以这里不用具体实现增加过程量,直接是最大权值就好,也就是b[n] 
		cout<<max(res1,res2)<<"\n";
		 
		 
    }
    return 0;
}
/*



*/

相关文章:

  • 02 NLP合集-神经网络从0开始推理-一个间的神经网路的预测-没有backforward的情况下
  • 驱动程序开发:SPI设备驱动
  • PostgreSQL - 基于pg_basebackup实现主从流复制
  • Java项目源码ssm+mysql实现进销存系统|仓库
  • 黑马瑞吉外卖之套餐信息的分页查询
  • 9.14 c++基础
  • python创建智能问答机器人
  • MyBatis的简介和核心的组件(映射器、执行器、SqlSession及其工厂)
  • 《计算几何》学习笔记
  • 干货分享:Docker 容器应用示例
  • 闭包的定义,原理,应用场景,优点,缺点
  • js控制台输出佛祖保佑图形图案/彩色图形图案实例代码
  • 黑客进行攻击中最重要的环节“信息收集”
  • Vue(6)
  • JSON 数据类型转换工具
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • codis proxy处理流程
  • Docker: 容器互访的三种方式
  • golang 发送GET和POST示例
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • idea + plantuml 画流程图
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • javascript数组去重/查找/插入/删除
  • JS+CSS实现数字滚动
  • Js基础知识(一) - 变量
  • Less 日常用法
  • SwizzleMethod 黑魔法
  • windows下mongoDB的环境配置
  • 记一次和乔布斯合作最难忘的经历
  • 模型微调
  • 前端学习笔记之观察者模式
  • 小试R空间处理新库sf
  • 与 ConTeXt MkIV 官方文档的接驳
  • FaaS 的简单实践
  • Java数据解析之JSON
  • raise 与 raise ... from 的区别
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​520就是要宠粉,你的心头书我买单
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)VirtualBox安装增强功能
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net web项目 调用webService
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /bin/rm: 参数列表过长"的解决办法
  • @EnableWebMvc介绍和使用详细demo
  • [Android]使用Retrofit进行网络请求
  • [Android]竖直滑动选择器WheelView的实现
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [BZOJ 3282] Tree 【LCT】
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [codevs 1515]跳 【解题报告】