Educational Codeforces Round 100 (Rated for Div. 2) 1463D. Pairs

题意:你有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;

}


原文地址:https://www.cnblogs.com/ruanbaiQAQ/p/14197237.html