首页 > 其他分享 >CodeForces 1886E I Wanna be the Team Leader

CodeForces 1886E I Wanna be the Team Leader

时间:2023-10-14 16:34:28浏览次数:44  
标签:typedef int long ge Team 集合 Wanna Leader define

洛谷传送门

CF 传送门

把题意抽象成,给你长为 \(n\) 的序列 \(a\) 和长为 \(m\) 的序列 \(b\),初始有 \(m\) 个空集合(可重集),\(a\) 中的每个元素至多被分到 \(m\) 个集合中的一个。要求最后第 \(i\) 个集合 \(T_i\) 不为空,且 \(\forall x \in T_i, x \ge \frac{b_i}{|T|}\)。要求构造方案或报告无解。

先把 \(a\) 从大到小排序。发现最后每个集合分到的一定是在排序后序列的一段区间。因为 \(11121222\) 显然比 \(11112222\) 劣。

然后考虑一个从前往后分配集合元素的可行性 dp。设 \(f_{i, S}\) 为当前 \(a\) 中 \([1, i]\) 的元素被分配完了,\(S\) 为已经考虑完的集合的编号集合为 \(S\)。转移枚举下一段的右端点 \(j\),枚举 \([i + 1, j]\) 被分到第 \(k\) 个集合,有 \(f_{j, S \cup \{k\}} \gets f_{i, S}\)。要求 \(a_j \ge \frac{b_k}{j - i}\)。

发现这个 dp 太蠢了。考虑直接把第一维塞进 dp 值中。重新设 \(f_S\) 为已经考虑完的集合的编号集合为 \(S\),若 \([1, i]\) 被分配完了,\(i\) 的最小值。预处理出 \(g_{i, j}\) 表示最小的 \(k\) 使得 \(a_k \ge \frac{b_i}{k - j}\),转移考虑枚举下一个集合是第 \(k\) 个,有 \(f_{S \cup \{k\}} \gets g_{k, f_S + 1}\)。

求 \(g\) 可以双指针,因为 \(g_{i, j}\) 随 \(j\) 增大而不降。所以整个的复杂度就是 \(O((n + 2^m) m + n \log n)\)。

code
// Problem: E. I Wanna be the Team Leader
// Contest: Codeforces - Educational Codeforces Round 156 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1886/problem/E
// Memory Limit: 512 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;
const int maxm = (1 << 20) + 50;

ll n, m, b[25], g[25][maxn], f[maxm], p[maxm];
vector<int> ans[25];

struct node {
	ll x, i;
} a[maxn];

void solve() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i].x);
		a[i].i = i;
	}
	sort(a + 1, a + n + 1, [&](const node &a, const node &b) {
		return a.x > b.x;
	});
	for (int i = 1; i <= m; ++i) {
		scanf("%lld", &b[i]);
	}
	for (int i = 1; i <= m; ++i) {
		for (int j = 1, k = 1; j <= n; ++j) {
			k = max(k, j);
			while (k <= n && a[k].x * (k - j + 1) < b[i]) {
				++k;
			}
			g[i][j] = k;
		}
	}
	mems(f, 0x3f);
	f[0] = 0;
	for (int S = 0; S < (1 << m); ++S) {
		if (f[S] >= n) {
			continue;
		}
		for (int i = 1; i <= m; ++i) {
			if (S & (1 << (i - 1))) {
				continue;
			}
			int T = S | (1 << (i - 1));
			if (f[T] > g[i][f[S] + 1]) {
				f[T] = g[i][f[S] + 1];
				p[T] = i;
			}
		}
	}
	if (f[(1 << m) - 1] > n) {
		puts("NO");
		return;
	}
	puts("YES");
	int S = (1 << m) - 1;
	while (S) {
		int T = S ^ (1 << (p[S] - 1));
		for (int i = f[T] + 1; i <= f[S]; ++i) {
			ans[p[S]].pb(a[i].i);
		}
		S = T;
	}
	for (int i = 1; i <= m; ++i) {
		printf("%d ", (int)ans[i].size());
		for (int x : ans[i]) {
			printf("%d ", x);
		}
		putchar('\n');
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,int,long,ge,Team,集合,Wanna,Leader,define
From: https://www.cnblogs.com/zltzlt-blog/p/17764323.html

相关文章

  • 下载的PC游戏启动后报错:无法加载 DLL“steam_api64”: 动态链接库(DLL)初始化例程失败
    无法加载DLL“steam_api64”:动态链接库(DLL)初始化例程失败。(异常来自HRESU解决方式:将文件夹拷贝到Steam-->steamapps文件夹下面还好是忍者神龟抛了个异常,才找到了问题所在,论抛异常的重要性!!!忍者神龟如龙......
  • CF1886E I Wanna be the Team Leader
    贪心#动态规划QuestionMonocarp是一家大型IT公司的负责人他有\(m\)个项目个项目需要完成,第\(i\)个项目的难度为\(b_i\)他的团队离有\(n\)个程序员,第\(j\)个程序员的耐受能力为\(a_j\)Monocarp需要分配这些项目,需要满足每个程序员最多分配\(1\)个项目每......
  • Steam流对对象中的某一个字段进行去重
    在去重时,我们可以在sql中用distinct进行去重,但在我的实际使用中,发现该去重方式并不能对多条数据的某一条数据进行去重,于是在上网查证的时候,发现可以用groupby进行分组实现去重的操作,但是这样任然不能实现单一字段去重,于是便想起之前看到的操作。先把要查询的字段以不去重的方式进......
  • SWERC 2022-2023 - Online Mirror (Unrated, ICPC Rules, Teams Preferred)
    Preface纯纯的智商场,只能说老外的出题风格和国内的比赛差异还是挺大的这场开局被签到题H反杀后灰溜溜地下机,结果后面的题出的都还挺顺的等到最后徐神把J过掉后我们都以为D是个大分类讨论(实际上机房里的学长们都是用分类讨论过的),就不想写了挂机到结束后面看题解发现确实是分类......
  • Teamcenter 查询构建器“研究“
    查询构建器配置图打印下这不就是SQL????通信监视器看下......
  • 506_杂牌手柄游戏不适配?Steam这项功能其实就能解决
    这是一篇原发布于2020-03-2812:37:00得益小站的文章,备份在此处。前言市场上游戏手柄虽多,但PC游戏中做到能够适配的似乎也只有Xbox、PS、SwitchPro等大厂发布的手柄。即使游戏中有着手柄按键设置,但无法完美显示XYAB键、按键命名混乱一直是游戏玩家的硬伤。配置效果对比轶哥测......
  • Codeforces463-E.Team Work-组合数、DP
    Codeforces463-E.TeamWork题意:求\[\sum_{i=1}^n\binom{n}{i}i^k\]其中\(1\leqn\leq10^9\),\(1\leqk\leq5000\)。题解:其实这个题\(k\)的数据范围就已经暗示了做法的复杂度——应该是要去考虑根据\(k\)去递推了。首先为了方便,\(i=0\)这一项完全可以补上,用类似生成函......
  • 222_有了它,Steam史低价、历史价、外区价尽收眼底
    这是一篇原发布于2020-01-2415:21:00得益小站的文章,备份在此处。前言小伙伴们,大家新年好啊,祝大家新的一年:天天有钱、月月中奖、年年发财。什么?你说今天是除夕,还不能算新年?好吧好吧,但steam可在今天开启了农历新年特卖活动,算上今年,已经是第四个年头了。众多游戏开启了优惠活动,......
  • Teamcenter RAC 开发之《PlaceHolder》
    背景做个swing表单,有时候想实现一些网页input标签的placeHolder提示,可能本人写vueorhtml写多,对某些细节有强迫症,所以找小下资料实现方法(Swingx)看源码......
  • Teamcenter RAC 开发之《AbstractRendering》
    背景关于TeamcenterRAC客制化渲染表单,做一两个有时间做还是可以的,问题是大批量做的时候就会存在很多重复的代码例如:1.定义很多TCProperty,JTextFiled,itextField等很多属性2.很多重复的代码3.修改表单样式麻烦想法能不能像ORM框架一样,直接使用@注解实现TCProperty<......