题意:你有1~2n这2n个数,给你一个长度为n的数组b,让你去构造出b并且满足条件。构造要求:对于每一组合法的b,先定义计数x=0,每次从2n个数中选一对数,取其中的一个数去对应某一个bi,若这个数为这两个数中小的,则x++;最后让你求构造完每一个合法的b数组后选取的x的覆盖范围的大小
大概就是这个意思,原题面: https://codeforces.com/problemset/problem/1463/D
做法:考虑去计算这个覆盖范围的最大x与最小x之差加1作为答案。先贪心去求有多少个bi必须和一个大于它的数组合,计它为l,则n-l为x的最大值;
再去倒着贪心求有多少个数必须结合一个小于它的数,计它为r,r为x的最小值,则最终答案为n-l-r+1。
#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
#define fastio ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
const int maxn = 1e5 + 10;
int main()
{
fastio;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int>a(n + 2, 0);
a[n + 1] = n * 2 + 1;
for (int i = 1; i <= n; i++)cin >> a[i];
sort(a.begin() + 1, a.end());
int sum = 0;
int l = 0, r = 0;
for (int i = 1; i <= n; i++)
{
sum += a[i] - a[i - 1]-1;
if (sum)
sum--;
else l++;
}
sum = 0;
for (int i = n; i >= 1; i--)
{
sum += a[i + 1] - a[i]-1;
if (sum)
sum--;
else r++;
}
cout << (n-l) - r + 1 << endl;
}
return 0;
}