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

[题解]P4616 [COCI 2017/2018 #5] Pictionary

P4616 [COCI 2017/2018 #5] Pictionary

我们发现,第 \(i\) 天会让所有为 \((m-i+1)\) 倍数的节点相互连通。可以将 \((m-i+1)\) 向它所有的倍数连边,效果是相同的。

我们规定边权为 \(i\)

那么对于建好的图,我们不难发现查询 \((u,v)\) 其实是在查 \(u,v\) 间的最小瓶颈路。及所有路径上最大值的最小值。

可以对原图跑最小生成树,然后查询两点间最大边权即可。

不过我们加边已经是有序的了,所以加边过程中 用并查集维护一下连通性就可以了。

用的倍增,复杂度 \(O((n+q)\log n)\)。可以用 DFS 序求 LCA 做到 \(O(n\log n+q)\)

点击查看代码
#include<bits/stdc++.h>
#define eb emplace_back
using namespace std;
const int N=1e5+5;
int n,m,q,ffa[N],fa[N][20],mx[N][20],dep[N];
struct Ed{int to,w;};
vector<Ed> G[N];
inline int find(int x){return x==ffa[x]?x:ffa[x]=find(ffa[x]);}
inline void add(int u,int v,int w){G[u].eb(Ed{v,w});}
inline void uadd(int u,int v,int w){add(u,v,w),add(v,u,w);}
inline void dfs(int u){dep[u]=dep[fa[u][0]]+1;for(int i=0;i<19;i++)fa[u][i+1]=fa[fa[u][i]][i],mx[u][i+1]=max(mx[u][i],mx[fa[u][i]][i]);for(Ed i:G[u]){if(i.to^fa[u][0]) fa[i.to][0]=u,mx[i.to][0]=i.w,dfs(i.to);}
}
inline int calc(int u,int v){int a=0;if(dep[u]<dep[v]) swap(u,v);for(int i=19;~i;i--) if(dep[fa[u][i]]>=dep[v]) a=max(a,mx[u][i]),u=fa[u][i];if(u==v) return a;for(int i=19;~i;i--) if(fa[u][i]^fa[v][i]){a=max(a,mx[u][i]),u=fa[u][i];a=max(a,mx[v][i]),v=fa[v][i];}return max({a,mx[u][0],mx[v][0]});
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m>>q;for(int i=1;i<=n;i++) ffa[i]=i;for(int i=m;i;i--){for(int j=(i<<1);j<=n;j+=i){if(find(j)^find(i)) ffa[ffa[j]]=ffa[i],uadd(i,j,m-i+1);}}dfs(1);int a,b;while(q--){cin>>a>>b;cout<<calc(a,b)<<"\n";}return 0;
}
http://www.zskr.cn/news/27786.html

相关文章:

  • 2025.10.22总结 - A
  • 蛋白表达系统的技术布局与应用
  • 软件工程学习日志2025.10.22
  • Typora的多端同步方案,如何多台计算机共享md文件?Windows和Mac通过定时执行git来同步markdown文件
  • P2272 [ZJOI2007] 最大半连通子图
  • PCB线圈生成工具
  • 软件工程第三次作业--结对项目
  • CF2144D
  • 科学计算库Numpy
  • 10.22总结
  • 使用google上colab编辑器
  • 20251022周三日记
  • 图图
  • 软工结对作业
  • dfs模板(p1036)
  • CF2078D Scammy Game Ad
  • [树状数组]P11855 [CSP-J2022 山东] 部署 题解
  • C#/.NET/.NET Core技术前沿周刊 | 第 58 期(2025年10.13-10.19)
  • 完整教程:阿里云上CentOS6.9(停止维护)导致的yum下载chrony失败如何解决?
  • k8s 常用命令 - 实践
  • 申威架构ky10安装php-7.2.10.rpm详细步骤(国产麒麟系统64位)
  • Unity 虚拟仿真实验中设计模式的使用 ——策略模式(Strategy Pattern) - 指南
  • vue2:v-if和v-show的区别以及造成的影响
  • P6845 题解
  • office2024绿色精简版
  • LGP3694 邦邦的大合唱站队 学习笔记
  • TRAE 设计团队如何玩转 Vibe Coding(上)|高美感页面生成篇
  • 详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
  • LeeCode_226反转二叉树
  • TRAE 设计团队如何玩转 Vibe Coding(下)|设计工具生成与提效篇