The 18th Northeast Collegiate Programming Contest H

server/2025/3/14 0:17:40/

题目连接

最大值最小,对于套路化的题目来说一般先想二分?(不行试试DP?再试试网络流?),我们先试着二分答案 m i d mid mid,考虑如何检查,
题目说可以选择任一点为根,不好考虑我们不妨先选择1作为根节点
因为要让两个点的距离都尽可能的小,所以自然的选取两个节点的LCA会是第一直觉.
设两点间距离是 d i s dis dis ,点x到 LCA 的距离是 l e n len len ,首先显然的如果 d i s ≤ m i d dis\leq mid dismid随便选择一个点作为根都是可行的,否则,
对于x来说我们要找到它可以在mid步到达的节点(y同理) 如果 l e n ≤ m i d len \leq mid lenmid 那就说明在x到LCA的路径内部就已经会走mid步,就是官方题解中的mid级子树内,否则我们找到距离y 的 d i s − m i d − 1 dis-mid-1 dismid1节点,在这个节点到x之间,x走的步数都不超过mid.这样对于每一对点我们可以知道符合条件的节点是哪些,对这些节点取个交集即可,这里我采用了dfn序+差分求前缀和的方式

至此,我们的check策略就清楚了,对于每一个点对,求出符合条件的节点范围取交集即可,时间复杂度 O ( n l o g ) O(nlog) O(nlog)

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
using i128 = __int128;constexpr int maxn = 1e5+10;
int n,m,dep[maxn],fa[maxn][22],LCA[maxn],X[maxn],Y[maxn];//点,边,深度,倍增数组,LCA数组,点x,点y
int l[maxn],r[maxn],idx;//dfn序
vector<int> g[maxn];//树void dfs(int x,int father){dep[x] = dep[father]+1;fa[x][0]=father;l[x] = ++idx;for(int i = 0;i<=20;++i) fa[x][i+1] = fa[fa[x][i]][i];for(auto y:g[x]){if(y==father) continue;dfs(y,x);}r[x] = idx;
}
int lca(int x,int y){if(dep[x]<dep[y]) swap(x,y);for(int i = 20;i>=0;--i){if(dep[fa[x][i]]>=dep[y]){x = fa[x][i];}}if(x==y) return x;for(int i = 20;i>=0;--i){if(fa[x][i]!=fa[y][i]){x = fa[x][i];y = fa[y][i];}}return fa[x][0];
}int zx(int x, int k) {//求k级祖先for (int i = 0; k; ++i, k >>= 1)if (k & 1) x = fa[x][i];return x;
}void solve(){cin>>n>>m;for(int i = 1;i<=n-1;++i){int x,y;cin>>x>>y;g[x].emplace_back(y);g[y].emplace_back(x);}dfs(1,0);for(int i = 1;i<=m;++i){cin>>X[i]>>Y[i];LCA[i] = lca(X[i],Y[i]);}auto dis=[&](int x,int y,int z)->int{return dep[x]-2ll*dep[z]+dep[y];};auto check=[&](int mid)->bool{int c=0;vector<int> cnt(n+10,0);auto add = [&](int a, int b) { // 区间[a,b]加1if (a > b) return;cnt[a]++;cnt[b + 1]--;};auto exclude = [&](int a, int b) { // 补集:区间[1,a-1]和[b+1,n]加1add(1, a - 1);add(b + 1, n);};for(int i = 1;i<=m;++i){int x = X[i],y = Y[i];int dist = dep[x] + dep[y] - 2 * dep[LCA[i]];if(dist<=mid) continue;else if(dist>2*mid) return 0;else{int len = dep[x]-dep[LCA[i]];if(len>mid){int anc = zx(x,mid);add(l[anc], r[anc]);c++;}else{if(dist-mid-1<0) continue;int anc = zx(y,dist-mid-1);exclude(l[anc], r[anc]);c++;}len = dep[y]-dep[LCA[i]];if(len>mid){int anc = zx(y,mid);add(l[anc], r[anc]);c++;}else{if(dist-mid-1<0) continue;int anc = zx(x,dist-mid-1);exclude(l[anc], r[anc]);c++;}}}if(c==0) return 1;int sum = 0;for(int i = 1;i<=n;++i){sum+=cnt[i];if(sum==c) return 1;}return 0;};int l = 0,r = maxn;while(l<=r){int mid = (l+r)>>1;if(check(mid)) r = mid-1;else l = mid+1;}cout<<l<<"\n";
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int t=1;//cin>>t;while(t--) solve();return 0;
}

http://www.ppmy.cn/server/174752.html

相关文章

Qt C++ 实际开发中宏编译的运用

Qt C 实际开发中宏编译的运用 在Qt C开发中&#xff0c;宏编译&#xff08;Preprocessor Macros&#xff09;是一种强大的工具&#xff0c;用于在编译时根据条件生成不同的代码。宏编译可以用于跨平台开发、调试、功能开关等场景。以下将详细介绍宏编译在Qt C实际开发中的应用…

Linux进程信号二

1.软件条件产生信号 SIGPIPE是一种由软件条件产生的信号&#xff0c;在管道中出现过。 alarm函数 设置一个定时器&#xff0c;当时间到达时&#xff0c;会向进程发送SIGALRM信号。 #include <unistd.h> unsigned int alarm(unsigned int seconds); seconds参数&#x…

golang从入门到做牛马:第十八篇-Go语言递归函数:函数的“自我调用”

在Go语言中,递归是一种强大的编程技术,它允许函数调用自身。递归通常用于解决那些可以通过更小的子问题来解决的问题,例如计算阶乘、生成斐波那契数列等。递归函数在运行过程中会不断调用自身,直到满足某个条件为止。接下来,让我们一起深入了解Go语言中的递归函数。 什么是…

Unity大型游戏开发全流程指南

一、开发流程与核心步骤 1. 项目规划与设计阶段 需求分析 明确游戏类型&#xff08;MMORPG/开放世界/竞技等&#xff09;、核心玩法&#xff08;战斗/建造/社交&#xff09;、目标平台&#xff08;PC/移动/主机&#xff09;示例&#xff1a;MMORPG需规划角色成长树、副本Boss…

计算机视觉算法实战——茶园害虫识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 茶园害虫识别是农业领域中的一个重要研究方向&#xff0c;旨在通过计算机视觉技术自动识别茶园中的害虫种类&#xff0c;从…

2024年广州市智能网联汽车创新实践年度报告

政策法规方面&#xff0c;积极推进《广州市智能网联汽车创新发展条例》的制定和发布&#xff0c;不断完善法规标准体系&#xff0c;为产业创新发展营造良好政策环境&#xff1b;技术创新方面&#xff0c;企业加大研发投入&#xff0c;在自动驾驶算法、车联网安全等关键领域取得…

neo4j随笔-将csv文件导入知识图谱

目录 导入前的准备 导入csv文件 导入nodes1.1.csv并动态为节点添加标签 ​编辑导入relations1.1.csv并动态为关系添加标签 结果 导入前的准备 我有两个csv文件 nodes1.1.csv存放节点信息,用记事本打开&#xff0c;能正常显示&#xff0c;且编码为UTF-8&#xff0c;就可以…

自然语言处理文本分析:从词袋模型到认知智能的进化之旅

清晨&#xff0c;当智能音箱准确识别出"播放周杰伦最新专辑"的模糊语音指令时&#xff1b;午间&#xff0c;企业舆情系统自动标记出十万条评论中的负面情绪&#xff1b;深夜&#xff0c;科研人员用GPT-4解析百万篇论文发现新材料线索——这些场景背后&#xff0c;是自…