比赛 |
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;
}