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

P9433 [NAPC-#1] Stage5 - Conveyors

思路

\(k = n\) 时,我们只需要用树上权值加和减去 \(s\)\(t\) 的路径长度即可。

考虑对 \(s,t\) 是否在关键点组成的最小连通块内分类,记块内边权和为 \(sum\)

\(s\)\(t\) 都在连通块内,由特殊性质,当 \(s = t\) 只需恰经过每条边两次就可以走完,答案为 \(2 \times sum\)。那么一般地,当 \(s \neq t\) 时,无需再经过一次 \(s\)\(t\) 的路径,减去这条树上简单路径长度即可。

否则,树上倍增求出二者到连通块的距离,加上上一种情况的答案。

Code

#include<iostream>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=1e5+5;
const int LogN=20;
int n,Q,k,head[N],nxt[N<<1],to[N<<1],w[N<<1],cnt=0,father[N][LogN],dep[N],dis[N],sum_connected=0,st,import[N];
bool in[N];
// int f=0;
void Add(int u,int v,int cost)
{to[++cnt]=v;w[cnt]=cost;nxt[cnt]=head[u];head[u]=cnt;
}
void Dfs_Connected(int u,int fa)
{if(!import[u]) return;in[u]=true;// cout<<u<<' ';// f++;for(int i=head[u];i;i=nxt[i]){int v=to[i];if(v==fa) continue;Dfs_Connected(v,u);if(in[v]) sum_connected+=w[i];}
}
void Dfs_Father(int u,int fa,int cost)
{dep[u]=dep[fa]+1,father[u][0]=fa,dis[u]=dis[fa]+cost;for(int i=1;i<LogN;i++)father[u][i]=father[father[u][i-1]][i-1];for(int i=head[u];i;i=nxt[i]){int v=to[i];if(v==fa) continue;Dfs_Father(v,u,w[i]);import[u]+=import[v];}
}
int LCA(int u,int v)
{if(dep[u]<dep[v]) swap(u,v);for(int i=LogN-1;i>=0;i--)if(dep[father[u][i]]>=dep[v])u=father[u][i];if(u==v) return u;for(int i=LogN-1;i>=0;i--)if(father[u][i]!=father[v][i])u=father[u][i],v=father[v][i];return father[u][0];
}
int Dis(int u,int v)
{return dis[u]+dis[v]-(dis[LCA(u,v)]<<1);
}
int Query(int u,int v)
{int fu=u,fv=v;if(!in[u]){for(int i=LogN-1;i>=0;i--)if(father[fu][i]&&!in[father[fu][i]])fu=father[fu][i];fu=father[fu][0];}if(!in[v]){for(int i=LogN-1;i>=0;i--)if(father[fv][i]&&!in[father[fv][i]])fv=father[fv][i];fv=father[fv][0];}return -Dis(fu,fv)+Dis(u,fu)+Dis(v,fv);
}
int main()
{// freopen("carrier.in","r",stdin);// freopen("carrier.out","w",stdout);IOS;cin>>n>>Q>>k;for(int i=1;i<n;i++){int u,v,cost;cin>>u>>v>>cost;Add(u,v,cost);Add(v,u,cost);}for(int i=1;i<=k;i++){cin>>st;in[st]=import[st]=1;}Dfs_Father(st,0,0);Dfs_Connected(st,0);// cout<<'\n';// cout<<st<<' '<<f<<' '<<sum_connected<<'\n';// for(int i=1;i<=n;i++)   //     if(in[i]) cout<<i<<' ';// cout<<'\n';while(Q--){int S,T;cin>>S>>T;cout<<(sum_connected<<1)+Query(S,T)<<'\n';}return 0;
}

完结撒花~

http://www.jsqmd.com/news/39227/

相关文章:

  • P11038 【MX-X3-T5】「RiOI-4」Countless J-Light Decomposition
  • 【每日一面】BOM 是什么
  • P9638 「yyOI R1」youyou 的军训
  • P1012 [NOIP 1998 提高组] 拼数
  • 同步/异步和阻塞/非阻塞学习笔记
  • python 单词搜索(回溯-矩阵-字符串-中等)含源码(二十) - 指南
  • PHP生成RSA密钥对及RSA签名验证类库
  • 2025年杭州维修手机培训公司权威推荐榜单:手机维修教程/手机屏幕维修/维修手机源头公司精选
  • 2025年A2级防火抗倍特板批发厂家权威推荐榜单:高压耐火墙面装饰板/手HPL防火板/隧道防火装饰板源头厂家精选
  • 在基于FastAPI的Python开发框架后端,增加阿里云短信和邮件发送通知处理
  • 11月13日打卡
  • Comparative linguistics
  • 2025-11-11 PQ v.Next日志记录
  • ANT天线ESD防护
  • MATLAB离群点检测与删除
  • 2025短视频拍摄公司排名与推荐:3个核心标准帮你选对团队,避开无效投入
  • C#标签批量打印程序开发
  • 助力企业构建 AI 原生应用,函数计算 FunctionAI 重塑模型服务与 Agent 全栈生态
  • 小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇数据库篇MySQLMSSQLOracle自动化方案
  • vue2 混同,封装公共方法 - 东方不败-
  • 2025年PP多功能废气净化塔生产厂家权威推荐榜单:聚丙烯多功能废气净化塔/PPH多功能废气净化塔/PPH尾气吸收塔源头厂家精选
  • 2025年新疆初三复读班权威推荐榜单:中考复读快速提分/初三补习班/初三集训班源头服务商精选
  • source insight4菜单工具按钮变乱恢复
  • 2025 国产 ITSM 厂商选型全攻略:基础流程、智能赋能与全链路协同深度解析
  • 2025年新疆高三复读班权威推荐榜单:高三复读全日制/高三复读班/清北复读班学校精选
  • 2025年WMS仓库管理系统行业观察:智能仓储新格局加速成型
  • 2025 WMS仓库管理系统推荐排名
  • 深入解析:Linux Cgroup与Device Whitelist详解
  • 合并、拼接一个文件夹及其所有子文件夹中的代码文件(删除空行;软著源代码)
  • 2025年新疆初三复读班权威推荐榜单:初三补习班/初三集训班/本地中考复读学校精选