当前位置: 首页 > news >正文

洛谷 P3748 [六省联考 2017] 摧毁“树状图”

题目链接

看来这次出题人拉了坨大的,他还真有勇气,我一看,可以分成两种情况讨论:

  1. 两条链相交。因为题目要求交点最多一个,所以可以枚举交点,下面挂 \(0 \sim 4\) 条最大的链计算答案。

  2. 两条链无交。这时候可以把树分割成两棵子树,枚举割断的边计算答案。不妨可以钦定下面子树的根节点被链经过。

然后就可以换根 dp 了,状态设计和转移可以参考下面代码。

但是,出题人给了我们 \(x = 0/1/2\) 三种情况。不过,由于题目保证给出的路线最优,全部都当成 \(x = 0\) 来做就行啦。

时间复杂度 \(\text O (n)\)

/*
“答案”表示连通块数最大值 f[x][0~3]:x 下面挂的链的第 1~4 大答案 
g[x]:链端点是 x 的答案
h[x]:链在 x 子树内,经过 x 的答案 
p[x]:链在 x 子树内,不经过 x 的答案
*/#include<cstdio>
#include<algorithm>
#define N 500005
using namespace std;int T,cxk;
int read() {int x=0; char c=getchar();for(;c<'0'||c>'9';c=getchar());for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';return x;
}
void write(int x) {if(x>9) write(x/10);putchar('0'+x%10);
}
int n,ans,deg[N],g[N],h[N];
int tot,head[N],nxt[N*2],ver[N*2];
void insert(int x,int y) {ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
struct kmax {int k,mx[4],id[4];int& operator[](int x) {return mx[x];}void init(int u) {k=u;for(int i=0;i<k;i++) mx[i]=id[i]=0;}void ins(int x,int c) {if(c>mx[k-1]) {mx[k-1]=c,id[k-1]=x;for(int j=k-1;j&&mx[j]>mx[j-1];j--)swap(mx[j],mx[j-1]),swap(id[j],id[j-1]);}}void del(int x) {for(int i=0;i<k-1;i++)if(id[i]==x)swap(mx[i],mx[i+1]),swap(id[i],id[i+1]);if(id[3]==x)mx[3]=id[3]=0;}
} f[N],p[N];
void upd(int x) {g[x]=max(deg[x],f[x][0]+deg[x]-1);h[x]=max(g[x],f[x][0]+f[x][1]+deg[x]-2);
}
void dp(int x,int fa) {deg[x]=0,f[x].init(4),p[x].init(2);for(int i=head[x],y;i;i=nxt[i]) {if((y=ver[i])==fa) continue;dp(y,x),deg[x]++,f[x].ins(y,g[y]),p[x].ins(y,max(h[y]+1,p[y][0]));}upd(x);
}
void dfs(int x,int fa) {int sum=deg[x]; ans=max(ans,sum);for(int i=0;i<4;i++) sum+=f[x][i]-1,ans=max(ans,sum);int deg_=deg[x]; kmax f_=f[x],p_=p[x];for(int i=head[x],y;i;i=nxt[i]) {if((y=ver[i])==fa) continue;deg[x]--,f[x].del(y),p[x].del(y),upd(x);ans=max(ans,h[y]+max(h[x],p[x][0]));deg[y]++,f[y].ins(x,g[x]),p[y].ins(y,max(h[x]+1,p[x][0]));dfs(y,x),deg[x]=deg_,f[x]=f_,p[x]=p_;}
}
int main() {scanf("%d%d",&T,&cxk);XJX:while(T--) {tot=0;for(int i=1;i<=n;i++) head[i]=0;n=read();for(int _=1;_<=cxk;_++) read(),read();for(int i=1,x,y;i<n;i++) {x=read(),y=read();insert(x,y),insert(y,x);}ans=0,dp(1,0),dfs(1,0);write(ans),putchar('\n');}return 0;
}
http://www.jsqmd.com/news/269109/

相关文章:

  • 第四章:网络编程
  • 洛谷 P5071 [Ynoi Easy Round 2015] 此时此刻的光辉
  • 2026企业微信私域运营工具推荐:微盛·企微管家为何成腾讯认证增长工具
  • 大数据情感分析:助力在线社交平台的安全管理
  • 营销型网站建设避坑要点:内容本地化和广告素材匹配怎么做
  • 如何培养学生学习word的兴趣?
  • 寒假生活记录
  • 奥比中光 Gemini 336L - 调试记录(Ubuntu 24.04)
  • 2026年深圳评价高的氮化铝陶瓷片厂家推荐,主要有哪些陶瓷片品牌? - 睿易优选
  • 即插即用系列(代码实践) | AMD核心模块:自适应多尺度分解框架——纯MLP架构吊打Transformer,时间序列预测新SOTA
  • 全网最全2026研究生AI论文平台TOP9:开题文献综述神器测评
  • Spark与Flink对比:流批一体架构的技术选型
  • Office 2021安装包免费版永久使用,附永久破解工具+详细安装教程
  • 禁止血压飙升:阿里大佬写的Controller太优雅了!
  • 微调与安全隐私:AI定制时代的机遇与防线
  • 阿里跳槽来的工程师,写个try catch的方式都这么优雅!
  • Redis 分片集群 完整性能测试报告
  • 接口防刷处理,这样实现更优雅!
  • 安克创新与飞书联合发布“安克 AI 录音豆” 手指可握仅重 10 克
  • 深入探讨大数据领域数据工程的发展趋势
  • 【技术收藏】风控系统的革命:大模型如何让审核员和初级算法工程师失业?
  • 自己写一个分布式定时任务框架+负载均衡+OpenAPI异步调用!
  • (TETCI 2024) 从 U-Net 到 Transformer:即插即用注意力模块解析
  • 如何加快 SQL 查询速度的同时保持 SQL 的简洁性?
  • MyBatis-Flex来了!完爆MyBatis-Plus?
  • 即插即用系列 | CVPR 2025 CATANet:一种用于轻量级图像超分辨率的高效内容感知 Token 聚合网络
  • 25年的关键词:失业、工伤、外包、投资回血……
  • 牛掰,MySQL 8.2 支持读写分离了!
  • 【PFJSP问题】自适应双种群协同鸡群算法ADPCCSO求解置换流水车间调度问题PFSP【含Matlab源码 14995期】
  • 洛谷 P3746 [六省联考 2017] 组合数问题