首页 > 其他分享 >Codeforces1917F - Construct Tree

Codeforces1917F - Construct Tree

时间:2023-12-25 19:55:24浏览次数:38  
标签:le int Tree Construct bitset Codeforces1917F

Codeforces1917F - Construct Tree

Problems

给一个长度为 \(n\) 的序列 \(l\) 和 \(d\)。

要求判断是否可以构造出一颗节点数为 \(n+1\) 的树,满足 \(l\) 的每一个元素唯一对应为一条边的长度,并使整棵树的直径长度恰好为 \(d\)。

Solution

不妨令 \(l_1 \le l_2 \le \cdots \le l_n\)。

考虑必须要找出 \(l\) 的子集使得其和为 \(d\)。同时考虑如何构造出一棵可行的树。

把选出的部分 \(l'\) 展成一条链,可以发现如果最后满足答案,充要条件使存在一个点,使得所有未被选中的边都可以直接连在这个点上,且直径仍然为最初 \(l'\) 展出的链。

设这个点为 \(v'\),链的两端分别为 \(v_1,v_2\),发现满足条件当且仅当:

\[\max\{\mathrm{distance}(v',v_1),\mathrm{distance}(v',v_2)\} + l_e\le d \]

其中 \(e\) 为任意一条没有选中的边。

发现实际上可以直接动态规划。固定分界点,记录以上的两个值,考虑怎么转移。

有点说不清楚,对着代码讲吧。(出题人的实现很牛,照搬过来的)

bitset < D > f[D >> 1];
void Push (int x){
    for (int i = d >> 1;i >= 0;-- i){
        if (i + x <= (d >> 1))
            f[i + x] |= f[i];
        f[i] |= f[i] << x;
    } // 正常转移
}
void WORK (){
    f[0][0] = 1;
    int id = 1;
    for (int i = 1;i <= (d >> 1);++ i){ // 钦定前面一维的长度不会超过 d/2
        while (id <= n && ! (l[id] ^ i))
            Push (l[id]), id ++;
        res = 0;
        for (int j = id;j <= n;++ j)
            res += l[j];
        if (res <= d - i && f[i][d - i - res]){
            // 这里实际上在考虑前一维为 i 的情况,所以可以不需要先转移后面。
            // 小于等于 i 的边此时一定可以挂在分界点上,或者参与转移。
            // 大于 i 的边此时不能挂在分界点上,
            // 而固定前一维为 i ,所以大于 i 的边此时一定会挂在后一维的链上。
            // 通过 d 算另一维的大小,再减去还没有考虑转移的(就是大于 i 的)边的长度和,判断是否存在即可
            puts ("Yes");
            return ;
        }
    }
    puts ("No");
}

需要用 \(\textrm{bitset}\) 。

时间复杂度 \(O(\frac{nd^2}{w})\)。\(w\) 为 \(\textrm{bitset}\) 的位数。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 2005, D = 2005;
bitset < D > f[D >> 1];
int T, n, d, sum, res, l[N];
void Push (int x){
    for (int i = d >> 1;i >= 0;-- i){
        if (i + x <= (d >> 1))
            f[i + x] |= f[i];
        f[i] |= f[i] << x;
    }
}
void WORK (){
    scanf ("%d%d", &n, &d);
    sum = 0;
    for (int i = 1;i <= n;++ i){
        scanf ("%d", &l[i]);
        sum += l[i];
    }
    if (sum == d){
        puts ("Yes");
        return ;
    }
    sort (l + 1, l + n + 1);
    for (int i = 0;i <= (d >> 1);++ i)
        for (int j = 0;j <= d;++ j)
            f[i][j] = 0;
    f[0][0] = 1;
    int id = 1;
    for (int i = 1;i <= (d >> 1);++ i){
        while (id <= n && ! (l[id] ^ i))
            Push (l[id]), id ++;
        res = 0;
        for (int j = id;j <= n;++ j)
            res += l[j];
        if (res <= d - i && f[i][d - i - res]){
            puts ("Yes");
            return ;
        }
    }
    puts ("No");
}
int main (){
    scanf ("%d", &T);
    while (T --)
        WORK ();
    return 0;
}

标签:le,int,Tree,Construct,bitset,Codeforces1917F
From: https://www.cnblogs.com/imcaigou/p/17926858.html

相关文章

  • Codeforces1917E - Construct Matrix
    Codeforces1917E-ConstructMatrix首先考虑因为\(n\)为偶数,所以\(k\)为奇数时不可能满足条件。其次,如果\(4|k\),那么实际上在矩阵中一直放\(2\times2\)的全为\(1\)的矩阵就可以了。随后,如果\(k\equiv2\mod4\),那么可以证明如果\(k\ne2\landk\nen^2-2\),......
  • SourceTree使用教程_network
    SourceTree使用教程1.克隆、提交、推送​ 在使用SourceTree之前必须要先安装Git和sourceTree,具体安装过程不再赘述(1)以加入我的管理团队为例,进入5-27-dq这个仓库,点击管理,然后进入仓库成员管理,发现现在我的仓库成员有4个了,gitee免费版最多可5个成员。​ 若要加入我的代码仓,请......
  • CF1055F Tree and XOR
    这道题代码虽然比较短,但花了我整整一天才过,太菜了这是CF241B的加强版,但是有点不同,因为CF241B后半部分求前\(k\)大的和没法优化了,而这道题能把前面的求第\(k\)小时间复杂度优化到单log,但是需要注意这道题开trie完全开不下,所以肯定没法trie上二分做到单log对于某些......
  • 牛客2022多校DAY10-K You are given a tree
    「牛客2022多校DAY10-K」Youaregivenatree...简要题意给一棵带点权和边权的树,找到至多\(k\)个点权不同的点,使得它们之间路径覆盖的边权和最大。\(n\le5000,k\le5\)。Solution考虑颜色数量不大的时候怎么暴力。显然可以直接状压DP,压一下当前选择的颜色集合为\(S\),......
  • [ATdp v] Subtree
    [ATdpv]Subtree思路不难想到令\(f_u\)表示\(u\)子树内满足条件的答案数。有\[f_{u}=\prod_{v\inson_{u}}(f_v+1)\]然后换根求出\(g\)表示整棵树里的答案:\[g_u=(\dfrac{g_{fa}}{f_u+1}+1)f_u\]但是你会发现取模之后不一定有逆元,很尴尬。所以如果把\(f_......
  • MapStruct+Maven+Lombok问题NoSuchBeanDefinitionException、does not have an access
    概述先直接说我遇到的问题吧,SpringBoot应用启动失败:ERROR|org.springframework.boot.web.embedded.tomcat.TomcatStarter|onStartup|61|-ErrorstartingTomcatcontext.Exception:org.springframework.beans.factory.UnsatisfiedDependencyException.Message:Error......
  • QTreeWidget使用小案例
    一、概述使用QTreeWidget制作一个树形菜单。示例图: 二、代码示例#include"TreeWidgetExampleWindow.h"TreeWidgetExampleWindow::TreeWidgetExampleWindow(QWidget*parent):QWidget(parent){this->setWindowTitle("TreeWidget组件");QVBoxLayout*......
  • Js 之treeTable树状表格
    一、下载/**树形表格3.xCreatedbywangfanon2020-05-12https://gitee.com/whvse/treetable-lay*/layui.define(['laytpl','form','util'],function(exports){var$=layui.jquery;varlaytpl=layui.laytpl;varform......
  • 【c# winform】devexpress treeList右键菜单添加按钮
    本文提供俩种不需要手动添加编辑控件方法。方法一:创建新的右键菜单添加“执行选择”按钮,且抑制TreeList自带菜单结果展示: 代码: privatevoidForm1_Load(objectsender,EventArgse){CreateBarButtonItem();}privatevoidCreateBarButtonItem(){//创建右键......
  • [Ynoi2007]rfplca/[CF1491H] Yuezheng Ling and Dynamic Tree
    题目描述给定一棵大小为\(n\)的\(1\)为根节点的树,树用如下方式给出:输入\(a_2,a_3,\dots,a_n\),保证\(1\leqa_i<i\),将\(a_i\)与\(i\)连边形成一棵树。接下来有\(m\)次操作,操作有两种:1lrx令\(a_i=\max(a_i-x,1)(l\leqi\leqr)\)。2uv查询在当前的\(a\)......