首页 > 其他分享 >CF1039D You Are Given a Tree

CF1039D You Are Given a Tree

时间:2023-11-01 19:55:06浏览次数:41  
标签:Given int Tree head dfs CF1039D maxn 100010 now

CF1039D You Are Given a Tree

更好的阅读体验

一种神奇套路:对答案根分,根分的依据是链的长度和答案大致是一个成反比的关系。

考虑确定了 \(k\) 怎么做。因为一个点只能在一条链里,所以 dfs 的时候如果能拼成一条链就一定会拼成一条链,不然就把贡献传给父亲继续尝试。

对于 \(k\) 比较小的时候可以暴力计算。对于 \(k\) 较大的情况,发现答案一定非严格单减,并且递减的幅度越来越小。所以对于 \(k\) 比较大的情况,可以通过枚举答案,二分找出答案对应的区间。

设块长为 \(B\),对于 \(k\leq B\) 暴力计算,\(k>B\) 枚举答案不会超过 \(\dfrac{n}{B}\),复杂度 \(\mathcal O(Bn+\dfrac{n^2}{B}\log n)\),块长取 \(1000\) 可以通过此题。

一点卡常技巧:dfs 的次数非常多,所以可以先 dfs 一遍,之后按照 dfn 序扫一遍即可。

	int n,cnt,ans,bl,len,tot,maxn[100010],maxm[100010],up[100010],a[100010],fin[100010],head[100010],to[200010],nex[200010];
	inline void add(int x,int y){to[++cnt]=y,nex[cnt]=head[x],head[x]=cnt;}
	void dfs0(int k,int fa)
	{
		a[++tot]=k,up[k]=fa;
		for(int i=head[k];i;i=nex[i])if(to[i]!=fa)dfs0(to[i],k); 
	}
	void dfs()
	{
		for(int i=n;i>=1;--i)
		{
			int now=a[i];maxn[now]=maxm[now]=0;
			for(int j=head[now];j;j=nex[j])
			{
				if(to[j]==up[now])continue;
				int t=maxn[to[j]];
				if(t>=maxn[now])maxm[now]=maxn[now],maxn[now]=t;
				else Mmax(maxm[now],t);
			}
			if(maxn[now]+maxm[now]+1>=len)++ans,maxn[now]=0;
			else ++maxn[now];
		}
	}
    inline void mian()
    {
    	read(n),bl=1000;int x,y;
    	for(int i=1;i<n;++i)read(x,y),add(x,y),add(y,x);
    	dfs0(1,0);
    	for(int i=1;i<=bl;++i)len=i,ans=0,dfs(),fin[i]=ans;
    	int tt=ans;
    	for(int i=0,last=n+1;i<=tt;++i)
    	{
    		int l=bl+1,r=last,mid;
    		while(l<r)
    		{
    			len=mid=l+((r-l)>>1),ans=0,dfs();
    			if(ans>i)l=mid+1;
    			else r=mid;
			}
			for(int j=l;j<last;++j)fin[j]=i;
			last=l;
		}
		for(int i=1;i<=n;++i)write(fin[i],'\n');
	}

标签:Given,int,Tree,head,dfs,CF1039D,maxn,100010,now
From: https://www.cnblogs.com/WrongAnswer90-home/p/17803955.html

相关文章

  • C# treeview 如何遍历MenuStrip的菜单
    需求分析: 数据菜单有四级菜单,需要在程序界面登录的时候遍历菜单的内容开发环境:VSC#winform步骤1:新建一个窗体步骤2:新建一个MenuStrip,并且定义内部的名称步骤3:新建一个Treeview步骤4:开始编程,定义一个参数函数: GetMenu(TreeView V,MenuStrip S)步骤5:编写参数函数的代码......
  • k-D Tree小记
    k-DTree是一种能够高效处理\(k\)维空间信息的数据结构。建树k-DTree具有二叉搜索树的形态,二叉搜索树上的每个结点都对应\(k\)维空间内的一个点。其每个子树中的点都在一个\(k\)维的超长方体内,这个超长方体内的所有点也都在这个子树中。假设我们已经知道了\(k\)维......
  • Sourcetree 合并分支到主干
     现在要合并dev分支到prd分支1、首先切换到dev分支,然后拉取代码,然后切换到prd分支,拉取代码;2、然后右击dev分支3、选择合并dev分支至当前分支(当前分支为prd分支)4、然后prd分支会显示有多个文件待推送,推送到仓库即可......
  • QTreeWidget 的搜索实时显示功能
    QTreeWidget的子条目很多时候需要提供实时的搜索功能,以便能快速找到所需要的条目。代码如下://1.创建当输入框文本变化时的信号槽。connect(ui.lineEditSearch,&QLineEdit::textChanged,this,&Demo01_GUI::OnFindItem);//2.槽函数实现检索时,实时显示符合要求的QTre......
  • Element Plus el-tree懒加载默认选中
    百度上试了很多方法,设置default-expanded-keys不生效,最后使用了下面的方法,亲测有效constloadNode=async(node:Node,resolve:(data:AreaType[])=>void)=>{if(node.level===0){const{data}=awaitgetRegionList(areaOptions)if(!props.special)......
  • QTreeWidget 添加右键菜单
    有时需要为QTreeWidget的子条目添加右键菜单功能,主要有两种方案来实现:方案一该方案比较通用,通过为QTreeWidget建立信号槽,在接受itemPressed的信号时会被触发,然后判断当前是否为鼠标右键,若为鼠标右键则创建添加对应的菜单栏,并提供相应的功能。//1.QTreeWidget*tree为......
  • PAT甲级:1174 Left-View of Binary Tree
     题目:1174Left-ViewofBinaryTree25分 题解:层次遍历输出每一行最左边的元素。(最开始以为输出部分节点的左子树...想不到思路)usingnamespacestd;#include<iostream>#include<vector>#include<map>#include<algorithm>#include<queue>#include<cmath>......
  • CF762F Tree nesting
    来一点更清楚的、实现方面的东西。做法同这篇,他的实现很优美但略微繁琐了些。枚举\(T\)的形态,发现这个匹配不过是把每个\(T\)中当前点的儿子塞进一个\(S\)中当前点的儿子内。于是\(f_{u,v}\)表示\(S\)中\(u\)匹配\(T\)中\(v\)且\(v\)整棵子树被匹配完的方案......
  • CF375E Red and Black Tree
    看错题看成只能交换相邻节点颜色了/fn每次操作交换两个节点颜色,可以转化为统计最终合法颜色序列相比开始,最少有多少个红点变成黑点。可以考虑一个类似树形dp的过程,对于每个节点我们钦定下它会被哪个节点“笼罩”,同时由于黑点数量有限,我们还需要记录下子树内已经用了多少个黑点......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(5) -- 树列表
    在我们展示一些参考信息的时候,有所会用树形列表来展示结构信息,如对于有父子关系的多层级部门机构,以及一些常用如字典大类节点,也都可以利用树形列表的方式进行展示,本篇随笔介绍基于WPF的方式,使用TreeView来洗实现结构信息的展示,以及对它的菜单进行的设置、过滤查询等功能的实现逻辑......