比赛 4043级NOIP2022欢乐赛3rd 评测结果 RRRRRRRRRR
题目名称 空图 最终得分 0
用户昵称 kowngx 运行时间 0.005 s
代码语言 C++ 内存使用 5.90 MiB
提交时间 2022-11-04 22:49:41
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
const int inf=1e9;
#define x first
#define y second
map<int,int> mp;

inline void add(int a){
	if(mp.find(a)==mp.end()) mp[a]=1;
	else mp[a]++;
	return;
}

inline ll get_k0(vector<int> a,int n){
	ll mx=-inf,mn=inf;
	for(int i=1;i<=n-1;i++){
		mx=max(mx,min(a[i],a[i+1]));
		mn=min(mn,a[i]);
	}
	mn=min(mn,a[n]);
	return min(2*mn,mx);
}

inline ll get_k1(vector<int> a,int n){
	int mn=inf,mx=-inf;
	for(int i=1;i<=n;i++) mn=min(mn,a[i]),mx=max(mx,a[i]);
	ll ans=-inf;
	for(int i=1;i<=n;i++){
		if(a[i]==mn){
			a[i]=inf;
			ans=max(ans,get_k0(a,n));
			a[i]=mn;
			break;
		}
	}
	int sm=inf;
	for(int i=1;i<=n;i++){
		if(a[i]==mx){
			if(i!=1) sm=min(sm,a[i-1]);
			if(i!=n) sm=min(sm,a[i+1]); 
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i]==sm){
			a[i]=inf;
			ans=max(ans,get_k0(a,n));
			break;
		}
	}
	return ans;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,k; cin>>n>>k;
	vector<int> a;
	a.resize(n+1);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		add(a[i]);
	}
	if(n==1){
		cout<<0<<'\n';
		return 0;
	}
	if(n==2){
		if(k==0) cout<<min(a[1],a[2]);
		else if(k==1) cout<<max(a[1],a[2]);
		else cout<<inf<<'\n';
		return 0;
	}
	if(k==0){
		cout<<get_k0(a,n)<<'\n';
		return 0;
	}
	if(k==1){
		cout<<get_k1(a,n)<<'\n';
		return 0;
	}
	if(k>=n){
		cout<<inf<<'\n';
		return 0;
	}
	int fm=-1,sm=-1,fmcnt=0;
	map<int,int>::iterator iter;
	for(iter=mp.begin();iter!=mp.end();iter++){
//		cout<<(iter->x)<<' '<<(iter->y)<<'\n';
		if(k-(iter->y)>=2){
			sm=fm;
			fm=(iter->x);
			k-=(iter->y);
		}
		else{
			sm=fm;
			fm=(iter->x);
			fmcnt=(iter->y);
		}
	}
	int mx=-inf;
	for(int i=1;i<=n;i++){
		if(a[i]<=sm) a[i]=inf;
	}
//	cout<<"doucu"<<k<<' '<<fmcnt<<' '<<sm<<'\n';
//	for(int i=1;i<=n;i++){
//		cout<<a[i]<<'\n';
//	}
	if(k<fmcnt){
		cout<<min(2*fm,inf)<<'\n';
		return 0;
	}
	if(k==fmcnt){
		for(int i=1;i<=n;i++){
			if(a[i]==fm) a[i]=inf;
		}
		cout<<max(min(2*fm,inf),get_k0(a,n))<<'\n';
		return 0;
	}
	if(k==fmcnt+1){
		for(int i=1;i<=n;i++){
			if(a[i]==fm) a[i]=inf;
		}
		cout<<max(min(2*fm,inf),get_k1(a,n))<<'\n';
		return 0;
	}
	return 0;
}