尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

洛谷 P11345 [KTSC 2023 R2] 基地简化 题解

洛谷 P11345 [KTSC 2023 R2] 基地简化 题解
📅 发布时间:2026/6/19 10:00:51

校内模拟赛题,倒在了正解前最后一步 qwq。

解题思路

首先,发现题目要求的东西很不好做。于是转化一下,考虑计算每条边对答案贡献了几次。

这样问题就转化成了求有多少个区间的点分布在一条边两端的两个子树中。

发现这个东西还是不好求。于是正难则反,考虑计算区间的点全部在同一个子树里的区间数量。

显然,这个数量可以通过 set 维护子树内外点的编号所形成的连续段实现。但实现起来细节较多,需要注意各种边界问题。

如果暴力地对每棵子树都把节点挨个 insert 一下去算这个东西,复杂度就是 \(O(n^2 \log n)\) 的,会直接 T 飞。

我们使用树上启发式合并优化这个过程。时间复杂度 \(O(n \log^2 n)\)。

Code

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i(a);i<b;++i)
#define rept(i,a,b) for(int i(a);i<=b;++i)
#define fi first
#define se second
#define int long long
using namespace std;
constexpr int N=3e5+5,P=1e9+7;
vector<pair<int,int>> g[N];
int n,tim;
int ans;
int l[N],r[N],siz[N],up[N],ch[N],rk[N];
signed maintenance_costs_sum(vector<signed> U,vector<signed> V,vector<signed> W);
inline int calc(int x){return x*(x+1)/2%P;
}
struct Set{set<pair<int,int>> s;int tot;void clear(){s.clear();s.emplace(1,n);tot=calc(n);}void insert(int x){auto it=prev(s.lower_bound({x,n+1}));int l=it->fi,r=it->se;if(l<x&&x<r){(tot-=calc(r-l+1))%=P;(tot+=calc(1))%=P;(tot+=calc(x-l))%=P;(tot+=calc(r-x))%=P;s.erase(it);s.emplace(l,x-1);s.emplace(x+1,r);return;}int lm=it==s.begin()?0:prev(it)->se;int rm=next(it)==s.end()?n+1:next(it)->fi;if(l==r){(tot-=calc(l-lm-1))%=P;(tot-=calc(rm-r-1))%=P;(tot-=calc(1))%=P;(tot+=calc(rm-lm-1))%=P;s.erase(it);return;}if(l==x){(tot-=calc(r-l+1))%=P;(tot-=calc(l-lm-1))%=P;(tot+=calc(r-l))%=P;(tot+=calc(l-lm))%=P;s.erase(it);s.emplace(l+1,r);return;}if(r==x){(tot-=calc(r-l+1))%=P;(tot-=calc(rm-r-1))%=P;(tot+=calc(r-l))%=P;(tot+=calc(rm-r))%=P;s.erase(it);s.emplace(l,r-1);}}
}st;
void add(int l,int r){rept(i,l,r){st.insert(rk[i]);}
}
void dfs(int u,int pre){l[u]=++tim,rk[l[u]]=u,siz[u]=1;for(auto [v,w]:g[u]){if(v==pre) continue;up[v]=w;dfs(v,u);siz[u]+=siz[v];if(siz[ch[u]]<siz[v]) ch[u]=v;}r[u]=tim;
}
void dsu(int u,int pre){st.clear();for(auto [v,w]:g[u]){if(v==pre||v==ch[u]) continue;dsu(v,u);st.clear();}if(ch[u]) dsu(ch[u],u);for(auto [v,w]:g[u]){if(v==pre||v==ch[u]) continue;add(l[v],r[v]);}add(l[u],l[u]);(ans+=up[u]*(calc(n)-st.tot))%=P;
}
signed maintenance_costs_sum(vector<signed> U,vector<signed> V,vector<signed> W){n=U.size()+1;rep(i,0,n-1){int u=U[i]+1,v=V[i]+1,w=W[i];g[u].emplace_back(v,w);g[v].emplace_back(u,w);}dfs(1,0);dsu(1,0);return (ans+P)%P;
}

相关新闻

  • Visual Studio Installer 2022正在进行准备
  • ANCEL AS100 OBD2 Scanner: Full EOBD/OBDII/CAN BMW Check Engine Light Diagnostic Tool
  • 2025最新广东餐饮生鲜配送服务商/厂家TOP5推荐!深圳/广州/佛山/东莞全覆盖,全品类供应+一体化服务权威榜单发布,赋能餐饮企业降本增效新生态

最新新闻

  • 2026梧州黄金回收白银回收铂金回收门店实测|本地正规实体老店无套路门店推荐 - 中安检金银铂钻回收
  • 从Simulink到Modelica:利用FMU实现跨平台模型迁移与协同仿真
  • 2026晋中黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 2026厦门黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 2026合肥本地中职择校:合肥理工官方招生老师联系号码 - 我叫小周
  • 2026绥化黄金回收白银回收铂金回收门店实测|本地正规实体老店无套路门店推荐 - 中安检金银铂钻回收

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号