CF1573B题解
题意:
对于给定的序列 、,从中取出 与 ,使得 ,且 的值最小。
思路:
可以快速推断出:对于 ,找到所有大于它的 ,再找到这些 中 最小的那个。 例如本题输入样例3,若取 数组的 ,则 数组中 ,, 三个元素皆符合题意,而这三个元素中位置最小的是 ,故取 。
由于给定的序列为奇偶顺序排列,故我们可以将 序列处理成 1=1,2=3,3=5,…,n=2*n-1 以及 1=2,2=4,…,n=2*n 。
而数组的读入则为:下标存值,元素内容存位置。
则:对于任意的 ,我们只需要找到 到 中位置最小的那个即可。而要实现这一目的,只需要倒序遍历处理一遍 数组即可。
附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;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575289

浙公网安备 33010602011771号