首页 > 其他分享 >种树

种树

时间:2024-09-14 11:23:54浏览次数:4  
标签:int root 贡献 100005 父亲 种树 配对

  • 当然可以用树形DP做,但是转移的细节很多,关键是要将所有可能的情况纳入DP的设计中
  • 四种情况:贡献1个给父亲、不需要父亲贡献、父亲贡献1个给该子树、父亲贡献2个给该子树
  • 题解的做法:对于1个大小为n的、只有根节点完成的子树,需要的次数一定为n/2
  • 另一种可能的做法:
  • 方案自动机:我们只要安排一种非关键点间的配对关系,总存在一个合法的构造方案能将其全部变为关键点,因而我们可以忽略具体的操作过程(操作不一定和配对对应)
  • 自底向上贪心,优先和兄弟配对,其次和父亲配对,其次和祖父配对
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[100005];
bool v[100005];
int sz[100005];
int n,m,ans,root;
void dp(int n1,int fa)
{
	sz[n1]=1;
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa)
        {
            int y=a[n1][i];
            dp(y,n1);
            sz[n1]+=sz[y];
        }
    }
    if(v[n1])
    {
    	ans=ans+sz[n1]/2;
    	if(sz[n1]%2==0)
    	{
    		v[fa]=true;
    	}
    	sz[n1]=0;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            a[i].clear();
            v[i]=false;
        }
        for(int i=1;i<=m;i++)
        {
            int x;
            cin>>x;
            v[x]=true;
            root=x;
        }
        for(int i=1;i<n;i++)
        {
            int u,v;
            cin>>u>>v;
            a[u].push_back(v);
            a[v].push_back(u);
        }
        ans=0;
        dp(root,0);
		cout<<ans<<"\n";
    }
    return 0;
}

标签:int,root,贡献,100005,父亲,种树,配对
From: https://www.cnblogs.com/watersail/p/18413589

相关文章

  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天,等等场景完全开源无任何代码加密使用Hbuilder导入插件即可使用。无后......
  • 洛谷-P1250 种树
    Abstract传送门Idea显然是一个差分约束系统。不妨用dist[i]表示前i个位置种的树的数目,那么,容易得出下列方程:dist[i]>=dist[i-1]dist[i]-dist[i-1]<=1(每个位置至多能种一颗树)题目要求b到e之间至少种t棵树,其数学形式就是:dist[b]-dist[e-1]>=t依据......
  • [题解]P9755 [CSP-S 2023] 种树
    P9755[CSP-S2023]种树迟来的补题本题是让最小化所有树长到指定高度日期的最大值,于是想到二分答案。那么,对于一个给定的期限\(x\),如何判断是否能在这个日期内完成任务呢?首先我们发现前\(n\)天每天都要种树,那么假设我们已经知道了每个地块最晚哪个日期种树,能保证在期限\(x\)......
  • 舞会无领导:一种树形动态规划的视角
    没有上司的舞会Ural大学有......
  • [CSP-S 2023] 种树
      #include<bits/stdc++.h>#definelllonglong#definepbpush_back#definemxn100003#definerep(i,a,b)for(inti=a;i<=b;++i)#definerept(i,a,b)for(inti=a;i<b;++i)usingnamespacestd;intn,p[mxn],d[mxn],ct[mxn];lla[mxn],b[mxn],c[m......
  • P1484 种树 题解
    P1484种树有\(n\)个坑。第\(i\)个坑种树的价值是\(c_i\),相邻坑不能同时种。可以种\(k\)颗树,求最大价值。模拟费用流,建图类似这样:中间两层结点之间有\(7\)条边,表示\(n=7\)的情况。相邻两条边,例如\(1,2\)总流入量为\(1\),\(2,3\)总流出量为\(1\),也不可能出现相......
  • P9755 [CSP-S 2023] 种树
    P9755[CSP-S2023]种树首先,容易看出单调性,可以对最少天数二分。转为判定性问题后,我们思考如何判定。对于每棵树,都可以从刚种下长到最后一天。我们由此可以写出\(calc(i,l,r)\)表示第\(i\)棵树从第\(l\)天长到第\(r\)天的高度。\(calc(i,l,r)=\sum\limits_{i=l}^r\max(......
  • 面试中可能问到的几种树结构(二叉树,平衡二叉树,红黑树,B树和B+树)
    二叉树的概念二叉树是一种树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。平衡二叉树概念平衡二叉树,是二叉树的一种变形,左子树的深度和右子树的深度不能超过一。红黑树概念红黑树是一种自......
  • P9836 种树 题解
    题目传送门前置知识质因数分解。贪心。题解思路先来解决一个问题,统计一个数\(x\)的正因数个数。可以将\(x\)质因数分解,得到每个数在\(x\)的质因数分解中出现了多少次。都知道质因数分解是每个数的唯一分解,那么统计个数的时候就只需要枚举每个质因数的出现个数。所以......