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

CF1045C Hyperspace Highways - Link

发现每个点双内两个点的距离为 \(1\),考虑使用圆方树。
建出圆方树后,方点点权为 \(1\),圆点点权为 \(0\),每次询问求路径上的点权和即可。

代码

#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=100010;
int n,m,q,dfn[maxn],low[maxn],tot,cnt,fa[maxn*2][20],deep[maxn*2],rdeep[maxn*2];
vector<int>e[maxn],st,r[maxn*2];
void dfs(int u){st.push_back(u);dfn[u]=low[u]=++tot;for(int v:e[u]){if(dfn[v]){low[u]=min(low[u],dfn[v]);continue;}dfs(v);low[u]=min(low[u],low[v]);if(low[v]==dfn[u]){cnt++;while(st.back()!=v){r[cnt].push_back(st.back()),r[st.back()].push_back(cnt);st.pop_back();}r[cnt].push_back(st.back()),r[st.back()].push_back(cnt);st.pop_back();r[cnt].push_back(u),r[u].push_back(cnt);}}
}
void dfs2(int u,int fa=0){rdeep[u]=rdeep[fa]+1;::fa[u][0]=fa;for(int i=1;i<=19;i++) ::fa[u][i]=::fa[::fa[u][i-1]][i-1];for(int v:r[u]){if(v==fa) continue;deep[v]=deep[u]+(v>n);dfs2(v,u);}
}
int lca(int u,int v){if(rdeep[u]<rdeep[v]) swap(u,v);for(int i=19;i>=0;i--) if(rdeep[fa[u][i]]>=rdeep[v]) u=fa[u][i];if(u==v) return u;for(int i=19;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];return fa[u][0];
}
signed main(){read(n,m,q);cnt=n;for(int i=1;i<=m;i++){int u,v;read(u,v);e[u].push_back(v),e[v].push_back(u);}for(int i=1;i<=n;i++) if(dfn[i]==0) dfs(i),st.clear();dfs2(1);for(int i=1;i<=q;i++,write('\n')){int u,v;read(u,v);int l=lca(u,v);write(deep[u]+deep[v]-deep[l]-deep[fa[l][0]]);}return 0;
}
http://www.jsqmd.com/news/144333/

相关文章:

  • 2025年跨境电商全产业链园区出租与办公室租赁推荐:五大高效赋能平台 - 品牌2026
  • 前端学习笔记迁移与整理:Bootstrap、jQuery与Vue实战
  • Vue精美商品分类组件,电商页面必备
  • 【Java毕设源码分享】基于springboot+vue的宿舍报修系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 还在用云端大模型?本地部署智谱Open-AutoGLM的7大不可抗拒理由
  • DMX512协议和 RDM协议
  • 2025年12月国内多级逆流离心萃取机厂家实力排行深度解析!连续化水洗/实验型/化工/液液/工业/系统多级逆流离心萃取机设备厂家推荐! - 品牌推荐用户报道者
  • 【Java毕设源码分享】基于springboot+vue的百货中心管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 架构师的系统思维:如何像侦探一样拆解一个陌生系统
  • 【Java毕设源码分享】基于springboot+vue的大学生校园线上招聘系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • PPAP流程详解及提交等级解析
  • 【scala】匿名函数和高阶函数
  • 2025年12月国内百/千/万/十万/三十万/百万级洁净实验室装修公司实力盘点:这几家行业标杆值得关注! - 品牌推荐用户报道者
  • C语言实现GBK到Unicode的字符转换
  • 将Forest应用的数据库从Derby迁移至MySQL
  • 帕普斯与帕斯卡定理的射影几何证明
  • 探索英威腾CHE100 - 2406变频器:学习路上的宝藏资料
  • 高清在线测试视频资源合集(含多分辨率MP4链接)
  • 第1章 Shell基础语法核心(20例,初级运维)-补充内容002【子Shell相关知识补充】
  • oem718d RTK基准站设置与测量操作全解析
  • 抖音直播卖货起号-桃李账号的不足
  • 大家常用的数据迁移工具
  • Open-AutoGLM 2.0云机上线:3大颠覆性升级如何重塑企业级AI部署格局
  • 基于多款软件的电池包仿真分析之旅
  • C4D材质基础:从金属到玻璃的质感模拟
  • 坐标转换与投影:解决 WebGIS 的坐标混乱问题
  • 5G核心网架构及会话管理关键技术解析
  • 从零到精通:掌握智谱清言沉思模式的8个核心指令与1个关键触发条件
  • 智谱AutoGLM开源了?手把手教你获取Open-AutoGLM源码并快速上手,错过等一年!
  • Ionic Framework发布Vue版本更新与修复