[SHOI2017] 摧毁“树状图”
首先只要得到 \(x=0\) 时的答案,就可以 \(AC\) 本题。这是很重要的。
考虑由于不能有重复经过的边,所以两路径交点数量 \(\le 1\)。
容易想到设 \(dp_u\) 表示以 \(u\) 为端点的链中的贡献最大值。考虑换根 \(dp\),所以先设它只表示它子树内的部分。
当交点数量 \(=1\) 时,显然可以理解为从一个节点出发的 \(0-4\) 条链,要这些链产生的贡献最大,所以要维护每个点的前四大链,这里的大指 \(dp\) 值大。
当交点数量 \(=0\) 时,可以看作是子树内有一条链,子树外有一条链的情况。
那么首先必须要维护前四大链 \(mx_{x,0/1/2/3}\)。
其次由于删掉一个点会产生儿子 \(+1\) 那么多个联通块,所以还要维护儿子数量 \(cnt_i\)。
考虑到子树内有一条链也得维护,所以得维护 \(f_i\) 表示过子树根的路径最大贡献,\(g_i\) 表示不一定过子树根的路径最大贡献。
由于 \(g_i\) 不好维护,所以再设 \(d_i\) 表示我们认为删掉 \(i\) 后 \(i\) 外还有联通块时,路径的最大贡献。那么就有:
dp_x=cnt_i+\max(0,mx_{x,0}-1)\\
f_x=\max(dp_x,mx_{x,0}+mx_{x,1}+cnt_x-2)\\
g_x=\max(\max\limits_{y\in sn_x}d_y,f_x)\\
d_x=\max(\max\limits_{y\in sn_x}d_y,f_x+1)
\end{cases}
\]
\(\max\limits_{y\in sn_x}d_y\) 可以通过预处理得到。换根时式子相同,所有定义中“子树内”全部改为“以该点为根的树”即可。
时间复杂度 \(O(tn)\)。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,ans,mx[N][5],fmx[N][3];
int t,id,f[N],dp[N],g[N],d[N];
vector<int>ve[N];
void add(int x,int v){
mx[x][4]=v;
for(int i=3;~i;i--)
if(mx[x][i+1]>mx[x][i])
swap(mx[x][i+1],mx[x][i]);
}void adf(int x,int v){
fmx[x][2]=v;
for(int i=1;~i;i--)
if(fmx[x][i+1]>fmx[x][i])
swap(fmx[x][i+1],fmx[x][i]);
}void dfs1(int x,int fa){
int cnt=ve[x].size()-1;
for(auto y:ve[x]) if(y!=fa)
dfs1(y,x),add(x,dp[y]),adf(x,d[y]);
dp[x]=cnt+max(1,mx[x][0])-1;
f[x]=max(dp[x],mx[x][0]+mx[x][1]+cnt-2);
g[x]=max(fmx[x][0],f[x]);
d[x]=max(fmx[x][0],f[x]+1);
}void dfs2(int x,int fa){
int sz=ve[x].size(),cnt=sz-1;
for(int i=0;i<5;i++)
ans=max(ans,sz),sz+=mx[x][i]-1;
for(auto y:ve[x]){
if(y==fa) continue;
int mo=mx[x][0]+mx[x][1];
int mz=mx[x][0],mt=fmx[x][0];
if(dp[y]==mx[x][0])
mo+=mx[x][2]-mz,mz=mx[x][1];
if(dp[y]==mx[x][1]) mo=mz+mx[x][2];
if(fmx[x][0]==d[y]) mt=fmx[x][1];
dp[x]=cnt+max(1,mz)-1;
f[x]=max(dp[x],mo+cnt-2),add(y,dp[x]);
g[x]=max(mt,f[x]),d[x]=max(mt,f[x]+1);
adf(y,d[x]),ans=max(ans,g[x]+f[y]),dfs2(y,x);
}
}void solve(){
for(int i=1;i<=n;i++){
ve[i].clear(),g[i]=d[i]=f[i]=dp[i]=0;
mx[i][0]=mx[i][1]=mx[i][2]=mx[i][3]=0;
fmx[i][0]=fmx[i][1]=0;
}cin>>n;int tmp;
for(int i=0;i<id*2;i++) cin>>tmp;
for(int i=1,x,y;i<n;i++)
cin>>x>>y,ve[x].push_back(y),ve[y].push_back(x);
ans=0,dfs1(1,0),dfs2(1,0),cout<<ans<<"\n";
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t>>id;
while(t--) solve();
return 0;
}
[SHOI2017] 摧毁“树状图”的更多相关文章
- bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status ...
- BZOJ4871 Shoi2017摧毁“树状图”(树形dp)
设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】
做不来--参考https://www.cnblogs.com/ezyzy/p/6784872.html #include<iostream> #include<cstdio> ...
- bzoj4871 [Heoi2017]摧毁“树状图”
刷完了去年的省选题,发现自己dp已经凉凉了. 虽然暴力可以拿到80分的好成绩,但是正解的dp状态和转移还是没能想到,是时候补一波dp了 这道题我们肯定是要树形dp,存的肯定就是子树某种状态的最多的联通 ...
- P3748 [六省联考2017]摧毁“树状图”
传送门 显然是可以树形 $dp$ 的 对每个节点维护以下 $5$ 个东西 $1.$ 从当前节点出发往下的链的最大贡献 $2.$ 节点子树内不经过本身的路径最大贡献 $3.$ 节点子树内经过本身的路径的 ...
- SqlServer-无限递归树状图结构设计和查询
在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...
- Android开源图表之树状图和饼状图的官方示例的整理
最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...
- D3树状图给指定特性的边特别显示颜色
D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...
- D3树状图异步按需加载数据
D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...
随机推荐
- uni-app 蓝牙扫码适配
1.前言 蓝牙设备扫码的效率要高于手机摄像头 App需要进行对蓝牙扫码枪进行适配才能正常使用蓝牙设备枪,并兼容之前的摄像头扫码 适配的关键在于:扫码枪进行扫码时,需要对其进行事件监听,并拿到条码的值 ...
- 全网最详细的Spring入门教程
为什么用Spring 什么是Spring Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性. Spring的一个最大的目的就是使JAVA EE开发更加 ...
- 使用Docker快速部署一个Net项目
前言 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 优点 Web 应用的自动化打包和发布. 自动化测试和 ...
- openEuler欧拉部署Jenkins
一.系统优化 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 二.安装Jenkins dnf -y install docker ...
- Finereport调用python服务进行大数据量导出
Finereport调用python服务进行大数据量导出 背景: 在使用finereport过程中,我们发现在数据导出这块一直是一个瓶颈,闲来无事,思索一番,想出来一种场景来应对此问题.供各位大佬参考 ...
- Docker安装FISCO BCOS区块链平台
2.0版本提供docker镜像,支持容器化部署,省去了很多编译安装过程遇到的各种问题. FISCO BCOS官方镜像docker地址:https://hub.docker.com/r/fiscoorg ...
- 【转载】Apache Doris、DorisDB傻傻分不清。。。
https://www.sohu.com/a/488816742_827544 相信这两天很多社区小伙伴都看到 StarRocks 所谓"开源"的动态了,开源用户群里有很多小伙 ...
- Qt通用方法及类库12
函数名 //初始化表格 static void initTableView(QTableView *tableView, int rowHeight = 25, bool headVisible = ...
- PostgreSQL 数据库连接
title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款 ...
- 【Java 温故而知新系列】基础知识-02 数据基本类型
1.Java基本数据类型 Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间. 基本数据类型 数值型:整数类型(byte,short,int,lon ...