首页 > 其他分享 >CodeForces 1917F Construct Tree

CodeForces 1917F Construct Tree

时间:2023-12-26 18:14:23浏览次数:38  
标签:typedef notin limits max Tree CodeForces Construct long define

洛谷传送门

CF 传送门

考虑形式化地描述这个问题。先把 \(l\) 排序。然后相当于是否存在一个 \(\{1, 2, \ldots, n\}\) 的子集 \(S\),使得:

  • \(\sum\limits_{i \in S} l_i = d\)。
  • \(\exists T \subseteq S, \max\limits_{i \notin S} l_i \le \min(\sum\limits_{i \in T} l_i, \sum\limits_{i \in S \land i \notin T} l_i)\)。

注意到若 \(n - 1 \in S \land n \in S\) 则第二个条件一定满足,让 \(n - 1 \in T\) 且 \(n \notin T\) 即可。所以如果 \(l_1, l_2, \ldots, l_{n - 2}\) 能凑出来 \(d - a_{n - 1} - a_n\) 就可行。

然后依次讨论 \(\max\limits_{i \notin S} i = n - 1\) 或 \(n\) 的情况。

  • 若 \(\max\limits_{i \notin S} i = n - 1\),那么 \(n \in S\)。若前 \(n - 2\) 个元素能凑出来和为 \(x\) 和 \(d - x - a_n\) 的两个不相交集合,且 \(a_{n - 1} \le \min(x + a_n, d - x - a_n)\) 就可行。
  • 若 \(\max\limits_{i \notin S} i = n\),那么若前 \(n - 1\) 个元素能凑出来和为 \(x\) 和 \(d - x\) 的两个不相交集合,且 \(a_n \le \min(x, d - x)\) 就可行。

二维可行性背包考虑 bitset 优化,复杂度 \(O(\frac{nd^2}{\omega})\)。

code
// Problem: F. Construct Tree
// Contest: Codeforces - Codeforces Round 917 (Div. 2)
// URL: https://codeforces.com/contest/1917/problem/F
// Memory Limit: 256 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 = 2020;

int n, m, a[maxn];
bitset<maxn> f[maxn], g;

void solve() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
	}
	sort(a + 1, a + n + 1);
	for (int i = 0; i <= m; ++i) {
		f[i].reset();
	}
	g.reset();
	f[0].set(0);
	g.set(0);
	for (int i = 1; i < n; ++i) {
		if (i == n - 1) {
			if (a[n - 1] + a[n] <= m && g.test(m - a[n - 1] - a[n])) {
				puts("Yes");
				return;
			}
			for (int j = 0; j <= m - a[n]; ++j) {
				if (a[i] <= min(j + a[n], m - a[n] - j) && f[j].test(m - j - a[n])) {
					puts("Yes");
					return;
				}
			}
		}
		for (int j = m; ~j; --j) {
			f[j] |= (f[j] << a[i]);
			if (j >= a[i]) {
				f[j] |= f[j - a[i]];
			}
		}
		g |= (g << a[i]);
	}
	for (int i = a[n]; i <= m - a[n]; ++i) {
		if (f[i].test(m - i)) {
			puts("Yes");
			return;
		}
	}
	puts("No");
}

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

标签:typedef,notin,limits,max,Tree,CodeForces,Construct,long,define
From: https://www.cnblogs.com/zltzlt-blog/p/17928977.html

相关文章

  • Codeforces Round 915 (div2) E
    E.TreeQueries[题目链接](https://codeforces.com/contest/1904/problem/EProblem-E-Codeforces)题意概括:给定一棵大小为\(n\)的树,回答如下询问,询问之间相互独立:给定一个点\(x\)与\(k\)个点\(a_i\),求出从\(x\)出发不经过任何一个\(a_i\)的最长简单路径长度......
  • codeforces刷题(1100):1917B_div2
    模板B、EraseFirstorSecondLetter跳转原题点击此:该题地址1、题目大意  给你一个字符串,可以执行任意次以下操作,生成最终的字符串(不可为空),问你能生成的不重复字符串数为多少。操作一:删除字符串第一个字符;操作二:删除字符串第二个字符。2、题目解析  发现,操作一:即选......
  • .net自带的树控件TreeView用法
    原文链接:https://blog.csdn.net/wenchm/article/details/133276828https://blog.csdn.net/xiaogongzhu001/article/details/131100371    TreeView控件(树控件)可以为用户显示节点层次结构,每个节点又可以包含子节点,包含子节点的节点叫父节点。就像在Windows操作系统的Wind......
  • C# WinForm控件之advTree
    原文链接:https://www.cnblogs.com/SoftWareIe/p/8757270.html0.属性和方法//属性方法advTree1.DragDropEnabled=!advTree1.DragDropEnabled;//控制是否可以拖动节点advTree1.MultiSelect=!advTree1.MultiSelect;//控制节点是否可以多选advTree1.ExpandButtonType=Dev......
  • 一个功能更强大,性能更高的树控件DevComponents.AdvTree.AdvTree(几种树形控件汇总)
    原文链接:https://www.cnblogs.com/a7373773/archive/2009/07/27/1532236.html一直在用DevComponents.DotNetBar2 控件近来探索Add()和AddRange()的性能问题。一样用极为不专业不科学的方法,比较DevComponents.AdvTree.AdvTree的Add()和AddRange()的性能 1private void butt......
  • Codeforces 1909G - Pumping Lemma
    这个题思考角度很多,做法也很多。这里介绍一种@asmend和我讲的做法。设\(d=m-n\),那么我们枚举\(|x|=i,|y|=j\),设\(s,t\)的LCP长为\(l_1\),LCS长为\(l_2\),那么可以得到这组\((i,j)\)合法的充要条件是:\(i\lel_1\)\(m-i-j-d\lel_2\)。\(d\bmodj=0\)。\(t[i,i+d-1......
  • Codeforces1917F - Construct Tree
    Codeforces1917F-ConstructTreeProblems给一个长度为\(n\)的序列\(l\)和\(d\)。要求判断是否可以构造出一颗节点数为\(n+1\)的树,满足\(l\)的每一个元素唯一对应为一条边的长度,并使整棵树的直径长度恰好为\(d\)。Solution不妨令\(l_1\lel_2\le\cdots\lel_......
  • CodeForces 1906K Deck-Building Game
    洛谷传送门CF传送门UNR#2黎明前的巧克力。枚举两个人选的卡的并集\(S\),那么当\(\bigoplus\limits_{i\inS}a_i=0\)时\(S\)有贡献\(2^{|S|}\)。考虑将\(2^{|S|}\)分摊到每个元素上,也就是每个元素有\(2\)的贡献,然后把这些贡献乘起来。所以题目其实是想让我们算......
  • Codeforces1917E - Construct Matrix
    Codeforces1917E-ConstructMatrix首先考虑因为\(n\)为偶数,所以\(k\)为奇数时不可能满足条件。其次,如果\(4|k\),那么实际上在矩阵中一直放\(2\times2\)的全为\(1\)的矩阵就可以了。随后,如果\(k\equiv2\mod4\),那么可以证明如果\(k\ne2\landk\nen^2-2\),......
  • Codeforces Round 917 (Div. 2)
    基本情况A题秒了,B题卡了一年。B.EraseFirstorSecondLetterProblem-B-Codeforces卡题分析两方面原因没有变通,一开始的思路是公式算出总字串数再想办法找重复的减掉,但搞了一个小时都不可行,应该早点换成正着来找的思路。没有更深入的分析样例。最后虽然出来了,......