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

ABC438

Solution

E

从每个 \(i\)\(a_i\) 连边,建出来一颗内向基环树。那么答案相当于非环节点到环上距离 + 若干倍整个环的和 + 环上一段路径和。预处理环上前缀和与节点到环的距离即可。代码不放了。

F

树上节点统一用 \(1~n\) 编号。
对答案拆一下贡献,即可发现要求对每个 \(i\),包含节点 \(1~i\) 的路径条数和。那么首先如果 \(1~i\) 都不在一条路径上肯定直接 break。
对结点 \(1\) 特判。不妨定义 \(L\)\(R\) 表示同时包含节点 \(1~i\) 的最短链的两端,\(dis(i,j)\) 表示树上两点间距离,\([i,j]\) 表示树上两点间路径。

先考虑加入节点 \(i\)\(L\)\(R\) 的变化。如果 \(dis(i,L)+dis(i,R)=dis(L,R)\),说明 \(i\) 已经在路径上,无变化;\(dis(i,L)+dis(L,R)=dis(i,R)\) 说明 \(L\) 在路径 \([i,R]\) 上,把 \(i\) 赋值给 \(L\)\(R\) 在路径 \([i,L]\) 上同理。三种情况都不满足,直接 break 即可。
然后考虑已知 \(L\)\(R\) 如何计算答案。不妨钦定 \(L\) 的深度不大于 \(R\) 的深度。分 \(2\) 种情况讨论:

  1. \(L\)\(R\) 的祖先。定义 \(son\)\(L\) 的某个儿子,且 \(son\)\(R\) 的祖先。则答案增加 \((n-sz_son)\times sz[R]\)
  2. \(L\)\(R\) 不为祖先-后代关系。则答案增加 \(sz_L \times sz_R\)

需要倍增求 LCA,复杂度 \(O(n \log n)\)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
int n,lg[N];
vector<int>G[N];
int dep[N],sz[N],fa[20][N];
void dfs(int x,int f)
{dep[x]=dep[f]+1;fa[0][x]=f;sz[x]=1;ll sum=0;for(auto y:G[x]){if(y==f)continue;dfs(y,x);sz[x]+=sz[y];sum+=sz[y];}
}
int lca(int u,int v)
{if(dep[u]<dep[v])swap(u,v);for(int i=lg[n];i>=0;i--)if(dep[fa[i][u]]>=dep[v])u=fa[i][u];if(u==v)return u;for(int i=lg[n];i>=0;i--)if(fa[i][u]!=fa[i][v])u=fa[i][u],v=fa[i][v];return fa[0][u];
}
int dis(int x,int y)
{int g=lca(x,y);return dep[x]+dep[y]-2*dep[g];
}
int getk(int u,int v)
{for(int i=lg[n];i>=0;i--)if(dep[fa[i][u]]>dep[v])u=fa[i][u];return u;
}
signed main()
{cin>>n;for(int i=2;i<=n;i++){lg[i]=lg[i>>1]+1;int u,v;cin>>u>>v;u++,v++;G[u].emplace_back(v);G[v].emplace_back(u);}dfs(1,0);for(int i=1;i<=lg[n];i++)for(int j=1;j<=n;j++)fa[i][j]=fa[i-1][fa[i-1][j]];int tp=1,ed=1;ll ans=n*(n+1)/2;for(auto i:G[1])ans-=sz[i]*(sz[i]+1)/2;for(int i=2;i<=n;i++){int x=dis(i,tp),y=dis(i,ed),z=dis(tp,ed);if(x+z==y) tp=i;else if(z+y==x)ed=i;else if(x+y!=z)break;if(dep[tp]>dep[ed])swap(tp,ed);int g=lca(tp,ed);if(g==tp)ans+=1ll*(n-sz[getk(ed,tp)])*sz[ed];else ans+=1ll*sz[tp]*sz[ed];}cout<<ans<<"\n";return 0;
}
http://www.jsqmd.com/news/150183/

相关文章:

  • 构建自动化CI/CD流程:TensorRT模型持续集成
  • Java计算机毕设之基于Spring Boot 社区助老志愿者服务平台的设计与实现基于springboot的老年志愿者服务智慧平台(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机Java毕设实战-基于JAVA技术的电商精准营销推荐系统设计及实现基于Spring Boot的电商精准营销推荐系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java毕设选题推荐:基于JAVA技术的电商精准营销推荐系统设计及实现基于Javaweb的电商平台个性化推荐系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 使用TensorRT优化LayoutParser文档解析模型
  • 基于TensorRT的智能客服系统并发能力提升三倍
  • 【收藏必备】程序员转型大模型AI:90天学习路径与高薪就业指南
  • Java毕设项目:基于JAVA技术的电商精准营销推荐系统设计及实现(源码+文档,讲解、调试运行,定制等)
  • YOLO11 Neck改进:引入密集连接DenseNet思想,在FPN/PANet的融合路径上,引入密集连接,让每个层都能接收到前面所有层的特征,增强特征流通
  • 如何在大学期间高效专注学习 Java:拒绝恋爱、闲聊与短视频的自律成长指南
  • NVIDIA Driver版本与TensorRT兼容性注意事项
  • NVIDIA Orin芯片上部署TensorRT自动驾驶模型案例
  • 转行AI大模型算法工程师,如何在人工智能领域实现职业跃迁
  • 甲骨文文字检测数据集VOC+YOLO格式6079张1类别
  • Redis 为什么能扛住百万并发?一文吃透它的四大核心设计哲学
  • 【毕业设计】基于springboot的老年志愿者服务智慧平台(源码+文档+远程调试,全bao定制等)
  • 鲲鹏原生加速之力:BoostKit KVecTurbo 源码解析与实战
  • 行业数据 benchmark 对比:DeepSeek上传数据生成竞品差距分析报告
  • 构建统一推理框架:TensorRT作为核心执行单元
  • 分布式并发更新指南:乐观锁、悲观锁、Redis 锁与消息队列
  • awk项目练习以及阶段项目
  • 2025 MBA必备!8个降AI率工具测评榜单
  • 计算机Java毕设实战-基于Spring Boot 社区助老志愿者服务平台的设计与实现基于springboot的老年志愿者服务智慧平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于springboot的老年志愿者服务智慧平台活动发布、健康监测、紧急呼叫【附源码、数据库、万字文档】
  • Spring Boot 集成支付宝支付完整方案
  • 探索三相并网逆变器双闭环控制:从理论到Matlab/Simulink仿真
  • 构建安全可信AI:TensorRT签名验证功能介绍
  • TensorRT与Prometheus监控系统集成教程
  • 2026年GEO优化源码搭建口碑排行榜单哪家好 - 源码云科技
  • 2025山东kbk起重机厂家有哪些:kbk组合起重机品牌推荐 - 栗子测评