CF1917F Construct Tree 题解
Description
给你一个数组
- 这棵树有
个点。 - 第
条边的长度是 。 - 树的直径是
。
只需要判断是否有解即可。
Solution
先把
容易发现把直径拉出来后,其他不在直径上的边
所以肯定是把不在直径上的边以类似菊花图的形式尽可能挂在中间,使得所有
如果
如果
如果
时间复杂度:
但是注意到
Code
#include <bits/stdc++.h> // #define int int64_t const int kMaxN = 2e3 + 5; int n, d; int a[kMaxN]; std::bitset<kMaxN> f[kMaxN]; void dickdreamer() { std::cin >> n >> d; for (int i = 1; i <= n; ++i) std::cin >> a[i]; std::sort(a + 1, a + 1 + n); if (a[n] > d / 2) { if (a[n - 1] > d - a[n]) return void(std::cout << "No\n"); f[0].reset(); f[0][0] = 1; for (int i = 1; i < n; ++i) f[0] |= (f[0] << a[i]); std::cout << (f[0][d - a[n]] ? "Yes\n" : "No\n"); } else { for (int i = 0; i <= d; ++i) f[i].reset(); f[0][0] = 1; for (int i = 1; i < n; ++i) { for (int j = d; ~j; --j) { f[j] |= (f[j] << a[i]); if (j >= a[i]) f[j] |= f[j - a[i]]; } } bool ans = f[0][d - a[n]]; for (int i = a[n]; i <= d - a[n]; ++i) ans |= f[i][d - i]; std::cout << (ans ? "Yes\n" : "No\n"); } } int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; std::cin >> T; while (T--) dickdreamer(); // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n"; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步