首页 > 其他分享 >2023 合肥站 热身赛 B Problem F. Flower’s Land 换根dp 依赖背包

2023 合肥站 热身赛 B Problem F. Flower’s Land 换根dp 依赖背包

时间:2023-11-27 15:24:19浏览次数:36  
标签:sz Land cc rep tn Flower 2023 include define

传送门。

求出包含某个点连通块大小为K的权值和最大值。

钦定1为根节点,只求根节点的答案,其实是一个依赖性01背包问题可以\(nk\)的时间内解决。

考虑进行换根操作,由于背包是取max的背包没办法进行背包的删除,然而取前后缀背包背包的合并为\(k^2\)复杂度过高。

当时还有一个想法是点分树,但是维护的信息还是太多也需要背包的合并。

我们考虑 up and down dp。

设\(f_{x,w}\)表示节点为x的子树内背包大小为\(w\)的最大价值。

设\(g_{x,w}\)表示节点为x向上不包含子树背包大小为\(w\)的最大价值。

\(f\)的转移是trivial的。

考虑\(g\)数组的求出。采用前后缀的背包进行合并。

这道题很特殊由于是树上依赖背包,我们要确保复杂度正确,直接合并\(g\)数组要枚举子树外大小,要合并的子树大小,无脑合并复杂度显然不对最坏就给卡到\(nk^2\)了。

我们基于当前子树设状态\(g_{x,w}\)表示节点为x外边大小为\(k-w\)的最大价值。

这样可以减少无用状态的枚举,保证均摊复杂度为\(nk\)。

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cctype>
#include <queue>
#include <deque>
#include <stack>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <string>
#include <ctime>
#include <cmath>
#include <cctype>
#include <cstdlib>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <algorithm>
#include <utility>
#include <bitset>
#include <set>
#include <map>
#define ll long long
#define db double
#define INF 1000000000
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define putl_(x) printf("%lld ",x);
#define get(x) x=read()
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(int i=p;i<=n;i+=1)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define mk make_pair
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define sq sqrt
#define x(w) t[w].x
#define r(w) t[w].r
#define id(w) t[w].id
#define R(w) s[w].r
#define yy p<<1|1
#define zz p<<1
#define sum(w) t[w].sum
#define mod 998244353
#define sc(A) scanf("%d",&A)
#define scs(A) scanf("%s",A);
#define put(A) printf("%d\n",A)
#define min(x,y) (x>=y?y:x)
#define max(x,y) (x>=y?x:y)
#define sub(x,y) (x-y<0?x-y+mod:x-y)
#define mes(a,k) memset(a,k,sizeof(a))
using namespace std;
const int MAXN = 40010, N = 3010;
int n, k;
int a[MAXN], sz[MAXN];
int tmp[MAXN], cnt[MAXN], ans[MAXN];
int f[MAXN][N], g[MAXN][N];
vector<int>G[MAXN];

void dfs(int x, int fa) {
	f[x][1] = a[x];
	sz[x] = 1;
	for (int cc = 0, tn; cc < G[x].size(); ++cc) {
		tn = G[x][cc];
		if (tn == fa)
			continue;
		dfs(tn, x);
		rep(0, min(sz[x], k), i)g[tn][i] = f[x][i];
		mes(tmp, 0xcf);
		rep(0, min(sz[x], k), i)rep(0, min(k - i, sz[tn]), j)
		tmp[i + j] = max(tmp[i + j], f[x][i] + f[tn][j]);
		sz[x] += sz[tn];
		rep(0,min(sz[x],k),i)f[x][i]=tmp[i];
	}
	f[x][0] = 0;
}

void dp(int x, int fa) {

	g[x][k]=0;
	rep(1, k, i)ans[x] = max(ans[x], f[x][i] + g[x][i]);
	//mes(tmp, 0xcf);
	rep(0, k, i)tmp[i] = g[x][i];
	reverse(G[x].begin(), G[x].end());
	int sum = sz[x];
	for (int cc = 0, tn; cc < G[x].size(); ++cc) {
		tn = G[x][cc];
		if (tn == fa)
			continue;
		mes(cnt, 0xcf);
		sum -= sz[tn];
		rep(0, min(sz[tn], k), i)
		rep(0, min(sum, k-i), j)
		{
			cnt[i] = max(cnt[i], g[tn][j] + tmp[i+j]);
		}
		rep(0, min(k, sz[tn]), i)g[tn][i] = cnt[i];
		mes(cnt, 0xcf);
		rep(0, min(k, sum), i)
		rep(0, min(sz[tn], k-i), j) {
			cnt[i] = max(cnt[i], f[tn][j] + tmp[i+j]);
		}
		rep(0, k, i)tmp[i] = cnt[i];
	}
	for (int cc = 0, tn; cc < G[x].size(); ++cc) {
		tn = G[x][cc];
		if (tn != fa)
			dp(tn, x);
	}
}

signed main() {
//	freopen("1.in", "r", stdin);
	sc(n);
	sc(k);
	rep(1, n, i)sc(a[i]);
	rep(2, n, i) {
		int x, y;
		sc(x);
		sc(y);
		G[x].pb(y);
		G[y].pb(x);
	}
	mes(f, 0xcf);
	dfs(1, 0);
	dp(1, 0);
	rep(1, n, i)printf("%d ", ans[i]);
	return 0;
}

标签:sz,Land,cc,rep,tn,Flower,2023,include,define
From: https://www.cnblogs.com/chdy/p/17859421.html

相关文章

  • 2023亚马逊云科技re:Invent美国拉斯维加斯,现已启幕!
    一年一度的全球云计算、科技圈的狂欢“Party”又双叒叕要来了!2023年11月27日,2023亚马逊云科技re:Invent正式向全球云计算从业者、合作伙伴发出邀请,相聚拉斯维加斯,共同开启一场创新探索之旅!  全球合作伙伴相约拉斯维加斯 突破挑战,获得更大成功 单丝不成线,独木不成林!合作伙伴的持......
  • ManageEngine 在2023年Forrester Wave™报告中被评为 "最佳表现者"
    我们很高兴地宣布,ManageEngine在2023年 TheForresterWave™,即《2023年第四季度企业服务管理》报告中被评为"最佳表现者"。该报告评估了排名前12位的ESM供应商及其在当前产品、战略和市场份额方面的表现。我们认为,ServiceDeskPlus令人难以置信的投资回报率、端到端自......
  • 2023 中国 Serverless 用户调查,邀您填写!
    当前云计算已成为数字时代的基础设施,支撑众多企业进行数字化转型升级。随着企业上云的范围更加广泛,国内云计算正在迈向云原生时代。Serverless技术因其以应用为中心、屏蔽底层复杂逻辑,灵活扩展,按需取用的特点,已经成为现代计算的一个重要组成部分,企业正在利用各种Serverless产品以......
  • 从嘉手札<2023-11-27>
    “我也没做错什么,放它去看海,总比跟着我好”很多时候,悲伤总是细细的钻进心底悄悄的生根发芽待到了时机它便如同一株参天巨树般郁郁葱葱郁郁葱葱的令人发疯人生本就像是做了一场旧梦醒来后枕头沾满泪水,我也分不清那究竟是我的记忆还是借来的情感时间过的太久连心动都记......
  • FlashDuty Changelog 2023-10-30 | 告警路由与 Slack 应用
    FlashDuty:一站式告警响应平台,前往此地址免费体验!告警路由什么是告警路由?FlashDuty已经与Zabbix、Prometheus等监控系统实现无缝集成,通过一个简单的webhook就可以把告警系统产生的所有告警事件推送到FlashDuty来管理。每个告警事件的重要性、紧急程度和所属团队可能不同,我们期望可以......
  • 极客挑战2023部分wp
    webezhttpeasy_phpPOST/?syc=welcome%20to%20GEEK%202023!&lover=2e4HTTP/2Host:sdjmytlkvr9c2362p1nccahfa.node.game.sycsec.comSec-Ch-Ua:"Chromium";v="105","Not)A;Brand";v="8"Sec-Ch-Ua-Mobile:?0Sec-Ch-Ua-Pla......
  • 2023-2024-1 20232309 《网络空间安全导论》第12(3)周学习总结
    2023-2024-120232309《网络空间安全导论》第12(3)周学习总结教材学习内容总结有点草率地看了一下课本,实在是无力细究......相对空泛的内容看书就行,就不写在思维导图里浪费时间了教材学习中的问题和解决过程1.重放攻击为什么可以造成伤害?chat-gpt对重放攻击的防御基于AI......
  • 2023版 STM32实战8 独立看门狗(IWDG)
     IWDG简介 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障。 说人话就是能解决程序跑飞的问题。  编写代码思路 -1-使用这个功能必须解除写保护-2-IW......
  • Firefox 在 2023 变得更快了
    Mozilla官方博客最近发表文章,称2023年Firefox在提升用户体验方面取得了显著的进展,真实用户使用Firefox能感受到速度更快。据介绍,Firefox通过收集与页面加载、响应速度、启动等浏览器性能相关的匿名化时间度量指标来衡量用户体验。文章分享了一些对用户浏览器体验至关重......
  • 2023年11月第四周总结
    堆堆是一种完全二叉树,也是一种优先级队列堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。写了一道可以用堆这种数据结构求解的题目,即找数组中第k大的数,要求时间复杂度为O(N)。力扣题目链接解题思......