CF1573B题解

题意:

对于给定的序列 aA1,aA2,,aAna_{A1},a_{A2},…,a_{An}bB1,bB2,,bBnb_{B1},b_{B2},…,b_{Bn},从中取出 aAka_{Ak}bBkb_{Bk},使得 aAk<bBka_{Ak}<b_{Bk},且 Ak+BkA_k+B_k 的值最小。

思路:

可以快速推断出:对于 aAka_{Ak},找到所有大于它的 bBkb_{Bk},再找到这些 bBkb_{Bk}BkB_k 最小的那个。 例如本题输入样例3,若取 aa 数组的 55,则 bb 数组中 66101088 三个元素皆符合题意,而这三个元素中位置最小的是 66,故取 66

由于给定的序列为奇偶顺序排列,故我们可以将 aa 序列处理成 1=1,2=3,3=5,…,n=2*n-1 以及 1=2,2=4,…,n=2*n 。 而数组的读入则为:下标存值,元素内容存位置。 则:对于任意的 aka_k,我们只需要找到 bkb_kbnb_n 中位置最小的那个即可。而要实现这一目的,只需要倒序遍历处理一遍 bb 数组即可。

附AC代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const long long maxm=1e18+5;
long long t,ans,n,a[maxn],b[maxn],x;
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		ans=maxm;
		for(int i=1;i<=n;i++){
			cin>>x;
			a[(x+1)/2]=i;
		}
		for(int i=1;i<=n;i++){
			cin>>x;
			b[x/2]=i;
		}
		for(int i=n-1;i>=1;i--){
			b[i]=min(b[i],b[i+1]);
		}
		for(int i=1;i<=n;i++){
			ans=min(ans,a[i]+b[i]-2);
		}
		if(ans!=maxm){
			cout<<ans<<"\n";
		}
		else{
        		cout<<0<<"\n";
   	  	}
	}
	return 0;
}
posted @   KK_SpongeBob  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示