F题
/*
二分答案
直接l, r拟定答案区间,在拟定答案进行测试,根据单调性,取k最小值。
*/
string s;
bool check(int m)
{
map<char, int> mp;
map<char, int> mpp;
for (int i = 0; i < m; i ++) mp[s[i]] ++;
for (char j = 'a'; j <= 'z'; j ++)
{
if (mp[j] > 0) mpp[j] ++;
}
for (int i = m; i < s.size(); i ++)
{
mp[s[i]] ++;
mp[s[i - m]] --;
for (char j = 'a'; j <= 'z'; j ++)
{
if (mp[j] > 0) mpp[j] ++;
}
}
for (auto t : mpp)
{
if (t.second == s.size() - m + 1) return false;
}
return true;
}
void solve()
{
cin >> s;
int l = 1, r = s.size();
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) l = mid + 1;
else r = mid;
}
cout << l << '\n';
}
G题
/*
注意x和k的范围,这个答案输出符合条件的x即可。
k可以为0, x的取值范围(1~1e9)
*/
int a[N];
void solve()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i ++) cin >> a[i];
sort(a + 1, a + n + 1);
if (a[k + 1] == a[k]) cout << -1 << '\n';
else if (k == 0 && a[1] == 1) cout << -1 << '\n';
else cout << max(a[k], 1) << '\n';
}