首页 > 其他分享 >【CF1917F】Construct Tree

【CF1917F】Construct Tree

时间:2023-12-28 12:56:38浏览次数:18  
标签:int Tree Construct -- 长度 最长 CF1917F

题目

题目链接:https://codeforces.com/contest/1917/problem/F
给出 \(n\) 条边的边权,询问是否可以构造出一棵树,使得所有边都被用上恰好一次且直径为 \(d\)。
\(n,d\leq 2000\)。

思路

首先肯定是找出一条长度为 \(d\) 的链,然后判断可不可以把剩下的所有边都挂在这条链的带权重心上。
如果最长的两条边的和已经超过 \(d\) 了,那么无解。
否则,考虑最长的边是否在这个长度为 \(d\) 的链上:

  • 如果在,那就把最长的边放在链的最前端,然后将剩余的边都挂在链的第二个节点上。显然这样不会产生长度超过 \(d\) 的链。
  • 如果不在,那么需要找到这条链上是否存在一个点,使得这个点切开后两条新的链长度都不小于最长的边的长度。
    设 \(f[i][j][k]\) 表示是否存在一种情况,满足前 \(i\) 个边选择了若干个,使得第一条链长度为 \(j\),第二条链长度为 \(k\)。然后直接上 01 背包即可。压掉第一维然后用 bitset 可以优化到 \(O(\frac{nd^2}{64})\)。

时间复杂度 \(O(\frac{nd^2}{64})\)。

代码

#include <bits/stdc++.h>
using namespace std;

const int N=2010;
int T,n,d,a[N];

int main()
{
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d%d",&n,&d);
		for (int i=1;i<=n;i++) scanf("%d",&a[i]);
		sort(a+1,a+1+n);
		if (a[n]+a[n-1]>d) { printf("No\n"); continue; }
		bitset<N> f[d+1]; f[0][0]=1;
		for (int i=1;i<n;i++)
			for (int j=d;j>=0;j--)
			{
				f[j]|=(f[j]<<a[i]);
				if (j>=a[i]) f[j]|=f[j-a[i]];
			}
		bool flag=f[d-a[n]][0];
		for (int i=a[n];i<=d-a[n];i++)
			flag|=f[i][d-i];
		printf("%s\n",(flag ? "Yes" : "No"));
	}
	return 0;
}

标签:int,Tree,Construct,--,长度,最长,CF1917F
From: https://www.cnblogs.com/stoorz/p/17932460.html

相关文章

  • CF396C On Changing Tree 题解
    CF396C考虑将贡献表示出来:\(\forallv\in\text{subtree}_u\),\(v\)会加上\(x-(dep_v-dep_u)k\),然后发现这个东西可以维护整棵子树,即把\(x,dep_u\timesk\)和\(dep_v\timesk\)分开计算,然后\(dep_v\)可以最后再管,就变为子树加,单点和了。用树状数组维护dfs序即可。......
  • springboot 中,ApplicationRunner、InitializingBean、@PostConstruct 执行顺序
    划水。。。ApplicationRunner、InitializingBean、@PostConstruct执行顺序InitializingBean是Spring提供的一个接口,它只有一个方法afterPropertiesSet(),该方法会在容器初始化完成后被调用。ApplicationRunner是SpringBoot提供的一个接口,它有一个方法run(),该方法会在......
  • C++ Qt开发:TableView与TreeView组件联动
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableView与TreeView组件联动的常用方法及灵活运用。本章我们继续实现表格的联动效果,当读者点击T......
  • 【OpenCV】【Python】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)
    在打算自己实现二维码的定位的时候,看到了相关博文的关于cv2.findContours返回的层级信息来定位三个“回”字从而达到定位二维码的目的,但是返回的hierarchy中的层级信息分别对应的是哪个轮廓却困扰了许久,查阅了很多资料最后还是自己手动找出了清晰的规律。关于hierarchy返......
  • CodeForces 1917E Construct Matrix
    洛谷传送门CF传送门\(2\nmidk\)显然无解。若\(4\midk\),发现给一个全\(2\times2\)子矩形全部异或\(1\)不会对行异或和和列异或和造成影响。那么我们找到\(\frac{k}{4}\)个全\(0\)的\(2\times2\)子矩形填\(1\)即可。否则若\(k=2\)或\(k=n^2-2\)......
  • constructor中的super
    1.ES6要求,子类的构造函数必须执行一次super函数。这是必须的,否则JavaScript引擎会报错。在执行super函数时,其实就是在创建子类的this,然后将父类的实例和方法放置在这个this对象中,子类在调用super之前是没有this的,所有的this操作都要在super()关键字后执行。由于super指向父类的......
  • CodeForces 1917F Construct Tree
    洛谷传送门CF传送门考虑形式化地描述这个问题。先把\(l\)排序。然后相当于是否存在一个\(\{1,2,\ldots,n\}\)的子集\(S\),使得:\(\sum\limits_{i\inS}l_i=d\)。\(\existsT\subseteqS,\max\limits_{i\notinS}l_i\le\min(\sum\limits_{i\inT}l_i,\sum......
  • .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......