CF1656A solution

Problem

给定序列 \(\{a_n\}\),找出一个数对 \((i,j)\) 满足 \(i,j\le n\) 且对于任意一个 \(1\le k\le n\)\(k\)\(|a_i-a_k|+|a_k-a_j|=|a_i-a_j|\)。如有多解,输出任意一个即可。

link->https://codeforces.com/contest/1656/problem/A

Solution

什么情况下 \(|a_i-a_k|+|a_k-a_j|=|a_i-a_j|\) 呢?是的,我们将绝对值符去掉,\(a_i-a_k+a_k-a_j=a_i-a_j\)

也就是说,对于任意一个 \(k\) 都有 \(a_i-a_k=|a_i-a_k|\)\(a_k-a_j=|a_k-a_j|\) 时该二元组 \((i,j)\) 就能满足条件。

容易发现,我们将 \(a_i\) 取最大值, \(a_j\) 取最小值时即可满足条件。

Code

#include<bits/stdc++.h>
#define pd push_back
#define pb pop_back
#define mk make_pair
//#define int long long
#define PII pair<int,int>
#define _for(a,b,c) for(int a=b;a<=c;a++)
#define _rep(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
template <typename T> inline void read(T& x) {
	x=0; T f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch&15); ch=getchar(); }
	x=x*f;
	return;
}
template <typename T,typename ...Arg> inline void read(T& x,Arg& ...arg){
	read(x); read(arg...);
}
int power(int a,int b) {
	int ans=1;
	do {
		if(b&1) ans*=a; a*=a;
	} while(b>>=1);
	return ans;
}
const int N=1e5+5;
int a[N],T,n;
signed main() {
	read(T);
	while(T--) {
		read(n);
		int max_k=0,min_k=n+1;
		a[0]=0; a[n+1]=0x7fffffff;
		_for(i,1,n) {
			read(a[i]);
			if(a[i]<a[min_k]) min_k=i;
			if(a[i]>a[max_k]) max_k=i;
		}
		printf("%d %d\n",min_k,max_k);
	}
	return 0;
}
posted @ 2022-08-01 14:09  lsj2009  阅读(40)  评论(0)    收藏  举报