首页 > 其他分享 >CF1945E Binary Search 题解

CF1945E Binary Search 题解

时间:2024-03-21 13:22:37浏览次数:24  
标签:二分 Binary Search CF1945E int 题解 mid

CF1945E Binary Search

题目大意

给定一个 \(1\sim n\) 的排列 \(A\)(不保证有序),对这个排列用如下代码片段二分,查找 \(m\) 的位置。

int l=1,r=n+1;
while(r-l>1)
{
    int mid=(l+r)/2;
    if(A[mid]<=m)	l=mid;
    else	r=mid;
}
cout<<l;

显然不一定能查找到正确位置,所以在开始查找之前,可以进行至多 \(2\) 次操作,每次操作可交换任意两个数的位置,可以保证 \(2\) 次操作一定能使答案正确。

Solve

由于体面说 \(2\) 次操作一定能使答案正确,我们不妨大胆地猜测一下:

先对原数列使用上面的代码,进行二分,将二分出来的位置(记为 \(x\))与 \(m\) 的位置交换即可。

然后就发现 AC 了。

考虑证明一下正确性:

显然我们最后二分出的 \(p_x\) 一定是 小于等于 \(m\) 的。然后考虑分情况讨论:

  • 如果二分过程中 \(\forall mid,A_{mid}\neq m\),那么这样交换肯定是没问题的,因为交换之后不会对 A[mid]<=m 这句话有影响。
  • 如果 \(\exist mid,A_{mid}=m\),那么交换之后 \(A_{mid}\) 就等于 \(p_x\) 了,此时 A[mid]<=m 仍然为真,不影响二分端点的变化。

得证。

Code

#include<bits/stdc++.h>
#pragma GCC optimize(1,2,3,"Ofast","inline")
using namespace std;
#define int long long
inline int read()
{
	short f=1;
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}
	while(c>='0'&&c<='9')	x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
int t,n,m,a[200010],pos;
signed main()
{
	t=read();
	for(int i=1;i<=t;i=-~i)
	{
		n=read();m=read();
		for(int j=1;j<=n;j=-~j)
		{
			a[j]=read();
			if(a[j]==m)	pos=j;
		}
		int l=1,r=-~n;
		while(r-l>1)
		{
			int mid=l+r>>1;
			if(a[mid]<=m)	l=mid;
			else	r=mid;
		}
		printf("1\n%lld %lld\n",l,pos);
	}
	return 0;
}

标签:二分,Binary,Search,CF1945E,int,题解,mid
From: https://www.cnblogs.com/sorato/p/18087159

相关文章

  • 关键词搜索拼多多商品列表数据接口(Pinduoduo.item_search)
    拼多多商品列表数据接口是一个允许开发者获取拼多多平台上商品列表信息的API接口。使用该接口,开发者可以批量获取商品的标题、价格、销量等信息。以下是使用此接口的步骤:注册账号:在拼多多开放平台注册成为开发者,并获取API凭证,如AppKey和AppSecret。或者是可以根据php,python......
  • 题解 P5809【【模板】多项式复合逆】
    \(\text{Link}\)力求把最新技术翻译地人人都能看懂。推荐先学习:拉格朗日反演。题意给出\(n\)次多项式\(F(x)\),求一个\(n\)次多项式\(G(x)\)满足\(F(G(x))\equivx(\bmodx^{n+1})\)。保证\([x^0]F(x)=0\)且\([x^1]F(x)\ne0\)。\(n\le2\times10^4\)。思路我们......
  • 20240320每日一题题解
    20240320每日一题题解Problem阿克曼(Ackermann)函数\(A(m,n)\)中,\(m,n\)定义域是非负整数(\(m\le3\),\(n\le10\)),函数值定义为:\(\mathit{akm}(m,n)=n+1\);(\(m=0\)时)。\(\mathit{akm}(m,n)=\mathit{akm}(m-1,1)\);(\(m>0\)、\(n=0\)时)。\(\mathit{akm}(m,n)=......
  • CF817F MEX Queries 题解
    题目链接:CF或者洛谷不是很难的题,但在这里提供一个动态开点线段树怎么卡空间卡过去的极致空间处理技巧全局\(mex\)问题,常见的做法就是维护权值树,然后找第一个没有权值的点,可以维护\(\min\),但本题存在第三个操作,所以不能再去传统地维护\(\min或者\max\)去辅助二分了。观......
  • [ARC174B] Bought Review 题解
    【题目描述】你开了一家店,有\(A_i\)个\(i\)星级评论,你可以花费\(P_i\)元买到一个\(i\)星评论,问使得这家店评论的星星平均值不小于\(3\),最少要花多少钱。\(1\lei\le5\)。【思路】首先读入,判断平均值是否小于\(3\),如果大于等于,直接输出\(0\)​然后根据\(3\t......
  • luogu6801题解
    本题解中不区别长度和宽度的区别,它们在本题解中指的是同一个东西。本题解做法用到单调栈。看这个特殊性质好像是让我们在高度上进行研究一下。子任务\(4\)的特殊性质是想让你搞明白在一个矩形中如何计算其内部的矩形个数。下面是一个\(4\times5\)大小的矩形。先来不考......
  • CF1091F 题解
    blog。提供线性做法,各方面完爆反悔贪心。先钦定能不飞就不飞,最后再分配盈余的能量。可能会在飞Lava的时候不够能量,只需要在前面来回移动,刷能量即可。由于Swim比Walk快,所以能Swim就全部用Swim刷能量,不能就Walk。最后是分配盈余能量。显然优先把Walk换成Fly,换一......
  • ElasticSearch - 基本操作
    前言本文记录ES的一些基本操作,就是对官方文档的一些整理,按自己的习惯重新排版,凑合着看。官方的更详细,建议看官方的。下文以books为索引名举例。新增添加单个文档(没有索引会自动创建)POSTbooks/_doc{"name":"SnowCrash","author":"NealStephenson","release_dat......
  • Elasticsearch-Mapping映射
    Mapping映射自动或手动为index中的_doc建立一种数据结构和相关配置动态映射:dynamicmapping,自动为我们建立index,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。PUT/web_site/_doc/1{"post_date":"2023-01-01","title":"Thelonger",......
  • javascript:void(0);用法及常见问题解析
    javascript:void(0);是一个常见的JavaScript代码片段,通常用于在HTML中作为超链接的href属性值或者事件处理函数的返回值。下面是关于它的用法和常见问题的解析:用法:作为超链接的href属性值:<ahref="javascript:void(0);">点击这里</a>这样做的作用是让点击链......