ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #768 (Div. 1)

2022-03-01 19:31:54  阅读:174  来源: 互联网

标签:sort 768 int sum Codeforces 序列 区间 Div 范围


比赛链接:

https://codeforces.com/contest/1630

B. Range and Partition

题目大意:

给定一个序列 \(a\),取一个范围 [x, y],将序列分成 \(k\) 段,每一段中在 [x, y] 这个范围中的数要严格大于不在该范围中的数,求使 \(y - x\) 最小的划分序列的方法。

思路:

设一个序列 \(A\),若 x <= \(a_i\) <= y,则 \(A_i\) = 1,否则等于 -1,对 \(A\) 求一个前缀和,记为序列 \(sum\),显然,我们要实现 \(sum_n\) >= k,转化一下。
\(sum_n = \sum_{i = 1}^n b_i = \sum_{i = 1}^n (-1 + 2 * [x <= a_i <= y]) >= k\),即 \(\sum_{i = 1}^n [x <= a_i <= y] >= \lceil \frac{k + n}{2} \rceil\),那么我们就可以遍历 \(x\),然后去找一个最小的 \(y - x\)。
所以我们可以 \(sort\) 一下序列 \(a\),然后找到最小的区间,接着去寻找方案。
寻找方案的过程可以通过序列 \(b\) 和 \(sum\),只要当在范围中的数大于不在范围中的数时,就分段,即该区间的和大于 0,所以该区间的 sum 等于上一个区间的 sum 加 1,这样分出的区间全满足条件。
如果区间超过了 \(k\),只需要将后面多的区间全部合并,单个区间已经满足了条件,合并的区间也会满足条件。

代码:

#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
int T, n, k;
void solve(){
	cin >> n >> k;
	vector <int> a(n);
	for (int i = 0; i < n; ++ i)
		scanf("%d", &a[i]);
	auto b = a;
	sort(all(b));
	int x = -1, y = n + 1;
	for (int i = 0; i <= n - (n + k + 1) / 2; ++ i){
		if (b[i + (n + k + 1) / 2 - 1] - b[i] < y - x){
			x = b[i];
			y = b[i + (n + k + 1) / 2 - 1];
		}
	}
	cout << x << " " << y << "\n";
	int l = -1, s = 0, p = 0; 
	for (int i = 0; i < n; ++ i){
		s += (x <= a[i] && a[i] <= y ? 1 : -1);
		if (s > p){
			p = s;
			if (s >= 1 && s <= k - 1){
				cout << l + 2 << " " << i + 1 << "\n";
				l = i;
			}
		}
	}
	cout << l + 2 << " " << n << "\n";
}
int main(){
	cin >> T;
	while (T--)
		solve();
	return 0;
}

标签:sort,768,int,sum,Codeforces,序列,区间,Div,范围
来源: https://www.cnblogs.com/Hamine/p/15952004.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有