首页 > 其他分享 >[QOJ4815] Flower's Land

[QOJ4815] Flower's Land

时间:2023-10-09 12:14:25浏览次数:37  
标签:rt 连通 Flower QOJ4815 int 分治 dfs Land 权值

简要题意:给出一个 \(n\) 个点的树,对某个点 \(i\) 求包含某一个点的大小为 \(k\) 的权值最大的连通块,一个连通块的权值是其所有点的权值之和。
\(n\le 40000,k\le \min(3000,n)\)

这个树上背包很难直接解决,考虑一种变体的树形背包:点分治。

点分治后,设分治中心为 \(rt\),那么如果要选上一个点 \(x\),\(rt\) 到 \(x\) 这条链上的所有点都要选上。

跑出点分治连通块的一个 dfs 序,设 dfs 序为 \(x\) 的点为 \(dfn_x\),那么一个点不选,他的子树都不能选,直接跳到 \(x+sz_x\),否则就跳到 \(x+1\).

要求包括某个点,可以对 dfs 序从前往后跑一次,从后往前跑一次,现在只要在 \(x\) 这个地方,枚举 \(k\),把前面的和后面的背包合并取个最大值就可以了。

复杂度 \(nklog n\),不好过。

但是当连通块大小小于 \(k\) 时,就可以不继续点分治了,复杂度 \(O(nklog\frac nk)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=40005,K=3005,INF=1e9;
int n,k,hd[N],mn,f[N][K],g[N][K],a[N],sz[N],dfn[N],ans[N],rt,res,vs[N],e_num,idx,ret;
struct edge{
	int v,nxt;
}e[N<<1];
void add_edge(int u,int v)
{
	e[++e_num]=(edge){v,hd[u]};
	hd[u]=e_num;
}
void dfs(int x,int y)
{
	sz[x]=1,dfn[++idx]=x;;
	for(int i=hd[x];i;i=e[i].nxt)
		if(e[i].v^y&&!vs[e[i].v])
			dfs(e[i].v,x),sz[x]+=sz[e[i].v];
}
void getsz(int x,int y,int n)
{
	int ret=0;
	sz[x]=1;
	for(int i=hd[x];i;i=e[i].nxt)
		if(e[i].v^y&&!vs[e[i].v])
			getsz(e[i].v,x,n),ret=max(ret,sz[e[i].v]),sz[x]+=sz[e[i].v];
	ret=max(ret,n-sz[x]);
	if(ret<mn)
		mn=ret,rt=x;
}
int findrt(int x,int n)
{
	mn=INF;
	getsz(x,0,n);
	return rt;
}
void solve(int x)
{
	dfs(x,idx=0);
	res+=sz[x]*k;
	for(int i=1;i<=sz[x]+1;i++)
		memset(f[i],-0x3f,sizeof(f[i])),memset(g[i],-0x3f,sizeof(g[i]));
	for(int i=0;i<=k;i++)
		f[1][i]=g[sz[x]+1][i]=0;
	for(int i=1;i<=sz[x];i++)
	{
		for(int j=0;j<k;j++)
			f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+a[dfn[i]]);
		if(i^1)
			for(int j=0;j<=k;j++)
				f[i+sz[dfn[i]]][j]=max(f[i][j],f[i+sz[dfn[i]]][j]);
	}
	for(int i=sz[x];i;i--)
	{
		for(int j=1;j<=k;j++)
			g[i][j]=g[i+1][j-1]+a[dfn[i]];
		for(int j=0;j<=k;j++)
			ans[dfn[i]]=max(ans[dfn[i]],f[i][j]+g[i][k-j]);
		if(i^1)
		{
			for(int j=0;j<=k;j++)
				g[i][j]=max(g[i][j],g[i+sz[dfn[i]]][j]);
		}
	}
	vs[x]=1;
	for(int i=hd[x];i;i=e[i].nxt)
		if(sz[e[i].v]>=k&&!vs[e[i].v])
			solve(findrt(e[i].v,sz[e[i].v]));
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",a+i);
	for(int u,v,i=1;i<n;i++)
		scanf("%d%d",&u,&v),add_edge(u,v),add_edge(v,u);
	solve(findrt(1,n));
	for(int i=1;i<=n;i++)
		printf("%d ",ans[i]);
}

标签:rt,连通,Flower,QOJ4815,int,分治,dfs,Land,权值
From: https://www.cnblogs.com/mekoszc/p/17724858.html

相关文章

  • flower插件-监视celery
    安装和使用:https://flower.readthedocs.io/en/latest/install.html#installationhttps://github.com/mher/flower/tree/master/examplescelery相关配置:#发送与任务相关的事件,以便可以使用flower之类的工具来监控任务#或者在启动worker服务时,使用-E参数。worker_send_task_......
  • 线段裁剪:Cohen-Sutherland算法
    目录裁剪算法Cohen-Sutherland线段裁剪算法基本思想具体步骤计算分析程序代码裁剪算法计算机内部存储的图形数据量通常较大,而屏幕只显示其中一部分,因此需要确定哪些部分在显示区域内,哪些在显示区域外。这个过程称为裁剪(clipping)。裁剪是二维观察(三维观察)的重要部分,参见计算机图......
  • GO基础环境搭建GoLand
    一、GO官方资料官网:https://golang.org/gosdk下载:https://golang.google.cn/dl/golang中文社区:https://studygolang.com/dl中文社区文档https://studygolang.com/pkgdoc二、开发环境配置1、GOSDK下载后,自行安装go语言开发需要使用gosdk,下载链接https://go.dev/dl/下载......
  • 使用idea自带的反编译工具 [FernFlower]
    终端直接输入命令java-cp参数1org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler-dgs=true参数2参数3参数说明:参数1。IDEA安装目录下的反编译插件“java-decompiler.jar”所在路径,需要加上双引号。示例:"E:\IntelliJIDEA2020.2.2\plugins\java-decomp......
  • goland编辑器编译的时候报错package xxx is not in GOROOT的原因排查
    先介绍下,我的目录部署情况1、GOROOT=C:\ProgramFiles\Go(我的golang环境装在c盘的)2、GOPATH=E:\Go(项目目录我放在E盘的)3、GO111MODULE=auto(默认值,没有改过)4、GOVERSION=go1.20.6(我的golang版本)5、项目结构,遵循官方推荐的方式E:\Go——bin——pkg——src 6、本次需要......
  • 「解题报告」The 1st Universal Cup. Stage 3: Poland
    大概按难度排序。签到题没写。QOJM.MinorEvil有\(n\)个球与\(k\)个操作,初始所有球都是白色的。第\(i\)个操作为如果\(a_i\)是白色的,那么就将\(b_i\)染成黑色,否则什么都不做。你可以选择每个操作执行或不执行,但是不能改变操作之间的相对顺序。现在你有一个球的集合......
  • 使用 goland 的模板提高编码效率
    整体步骤来自chatgpt概述我觉得编译器有几个很提效的工具:快捷键、代码补全和代码模板。前两个没啥可说的,今天想分享的是代码模板。在Goland里被称之为LiveTemplates。在代码里输入forr,随后会出现如下的可选项,选中按下回车后,会自动生活一个forrange的遍历模板,通过ta......
  • [HNCTF 2022 WEEK2]e@sy_flower
    花指令分析如果没接触过花指令,先看这个博客,大致了解一下花指令https://www.cnblogs.com/Here-is-SG/p/15802040.html点击此处下载附件查壳32位,无壳去除花指令用32位ida打开,就看到红色字体的XREF(非自然程序流程,可以用它对程序流进行跟踪和控制,估计以后有的学了),这时候F5反......
  • Codeforces 1868D. Flower-like Pseudotree
    题目链接:D-Flower-likePseudotree题目大意:给定度数数组\({d_n}\),要求构造一个\(n\)个点\(n\)条边的连通图(也就是基环树),允许有重边,但不能有自环。需要满足第\(i\)个点的度数恰好为\(d_i\),并且将环上的边全部删去后,剩下的每棵树的高度(以原先在环上的点为根)相同。首先考......
  • CF671D Roads in Yusland
    1D8ya。设\(f_{u,i}\)表示覆盖了\(u\)子树并且向上覆盖到了深度为\(i\)的最小代价。考虑合并儿子\(v\):\[f'_{u,i}\gets\min\left(f_{u,i}+\min\limits_{j=1}^nf_{v,j},f_{v,i}+\min\limits_{j=1}^nf_{u,j}\right)\]相当于区间加,单点取\(\min\),区间求最小值。直接......