Codeforces 982D - STL

解题思路:首先可以得到答案肯定是n个数里面的一个数+1,那么我们从大到小枚举它们,将它们之间的间隔距离和位置用set维护,当维护间隔距离的set里面的数都相等时,说明所有的间隔距离都一样,那么第i个数的值+1是一个可行解。注意n为1的时候要特判。


#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int mx = 1e5 + 10;
set <int> st;
set <pair<int,int>> past;
multiset <int> mulst;
int n;
int main()
{
	scanf("%d",&n);
	st.insert(0);st.insert(n+1);
	mulst.insert(n);
	int x;
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		past.insert(make_pair(x,i));
	}
	if(n==1) return 0*printf("%d\n",past.begin()->fi+1);
	int ans = 0,cnt = 0;
	for(int i=1;i<=n;i++){
		auto it = --past.end();
		int pos = it->se;
		auto l = st.lower_bound(pos),r = l--;
		//cout <<*r << " " <<*l << endl; 
		mulst.erase(mulst.find(*r-*l-1));
		if(pos-*l-1) mulst.insert(pos-*l-1);
		if(*r-pos-1) mulst.insert(*r-pos-1);
		if(mulst.size()&&*mulst.begin()==*(--mulst.end())){
			if(mulst.size()>=cnt){
				cnt = mulst.size();
				auto it1 = it;it1--;
				ans = it1->fi + 1;
			}
		} 
		past.erase(it);
		st.insert(it->se);
		///cout << 1 << endl;
	}
	printf("%d\n",ans);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/a1214034447/article/details/80541177