[QOJ4815] Flower's 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]);
}
[QOJ4815] Flower's Land的更多相关文章
- 微服务(Microservices)——Martin Flower【翻译】
原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 本文内容 微服务 微服务风格的特性 组件化(Componentization ) ...
- Autumn is a second spring when every leaf is a flower.
Autumn is a second spring when every leaf is a flower. 秋天即是第二个春天,每片叶子都是花朵.——阿尔贝·加缪
- POJ 1365 Prime Land(数论)
题目链接: 传送门 Prime Land Time Limit: 1000MS Memory Limit: 10000K Description Everybody in the Prime ...
- [2015hdu多校联赛补题]hdu5378 Leader in Tree Land
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树 ...
- UVALive 7261 Xiongnu's Land (扫描线)
Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against the ...
- hdu----(5050)Divided Land(二进制求最大公约数)
Divided Land Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- hdu-----(1507)Uncle Tom's Inherited Land*(二分匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1507 Uncle Tom's Inherited Land*(二分图匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Codeforces Round #312 (Div. 2) A. Lala Land and Apple Trees 暴力
A. Lala Land and Apple Trees Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/cont ...
随机推荐
- 每日一库:gosec
gosec 是一个用于在 Go 代码中查找安全问题的开源工具,它可以帮助发现可能的漏洞和潜在的安全风险.以下是关于 gosec 的详细介绍: 1. 工具概述: gosec 是一个静态分析工具,用于扫描 ...
- 【干货】华为云图数据库GES技术演进
本文分享自华为云社区<[干货]华为云图数据库GES技术演进>,作者: Chenyi. 1 背景 大规模图数据无处不在,图查询.分析和表示学习已成为大数据和AI的核心部分之一.特别是知识图谱 ...
- 三维模型OSGB格式轻量化的数据压缩与性能平衡分析
三维模型OSGB格式轻量化的数据压缩与性能平衡分析 在三维模型应用中,OSGB格式轻量化处理是一种常见的技术手段,它可以通过数据压缩.简化.滤波等操作,降低三维模型数据的存储空间和传输带宽需求,提高应 ...
- 获得lazada商品详情 API 返回值说明
item_get-获得lazada商品详情 注册开通 lazada.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) se ...
- ELK环境部署-Filebeat数据收集(三)
一.安装JAVA环境 1.解压jdk压缩包 abc@elk:~$ sudo tar -zxvf jdk-11.0.18_linux-x64_bin.tar.gz -c jdk11 2.添加环境变量 a ...
- 图解 LeetCode 算法汇总——链表
本文首发公众号:小码A梦 一般数据主要存储的形式主要有两种,一种是数组,一种是链表.数组是用来存储固定大小的同类型元素,存储在内存中是一片连续的空间.而链表就不同于数组.链表中的元素不是存储在内存中可 ...
- 【Qt6】列表模型——便捷类型
前一篇水文中,老周演示了 QAbstractItemModel 抽象类的继承方法.其实,在 Qt 的库里面,QAbstractItemModel 类也派生了两个基类,能让开发者继承起来[稍稍]轻松一些 ...
- 【解惑】孜孜不倦,用足球赛程详解c#中的yield return用法
在一个知名企业赞助的足球联赛中,有256支球队参赛.为了确保比赛的顺利进行,企业指派了小悦负责熬夜加班制定每一个球队的赛程.尽管她对足球的了解并不多,但是她对待工作的认真态度却让人钦佩. 在小悦的努力 ...
- Solution -「ARC 103B」Robot Arms
Description Link. 给定 \(n\) 组坐标.构造长度为 \(m\) 的序列 \(\{c_n\}\) 和 \(n\) 组包含 LRUD 的路径,满足对于每一组坐标: \(c_i\) 表 ...
- mysql8安装踩坑记
背景:已安装mysql5.7版本 问题一:默认的3306端口被占用 进入mysql5.7的my.ini文件,更改port为3307或者其他未被占用的端口 问题二:Install/Remove of t ...