RT。感觉代码复杂度是对的但是最后两个点开O2都过不去。思路是排序后每次找到最后一个最小值和第一个最大值以保持有序。然后模拟就行了。
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main(){
int n,ans,l,r,mid,*u;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
while(1){
u=upper_bound(a+1,a+n+1,a[1]);
if(a[1]==a[n]||*u==a[n]){
printf("Slavko\n%d %d",a[1],a[n]);
break;
}
*(u-1)=*u;
if(*upper_bound(a+1,a+n+1,a[1])==a[n]){
printf("Mirko\n%d %d",a[1],a[n]);
break;
}
l=1;
r=n;
while(l<=r){
mid=(l+r)>>1;
if(a[mid]<a[n]){
l=mid+1;
ans=mid;
}
else{
r=mid-1;
}
}
a[ans+1]=a[ans];
}
}