BSG白山极客挑战赛D 解题报告

2023-11-05 13:30

本文主要是介绍BSG白山极客挑战赛D 解题报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这题关键当然就在那个非常神的性质。

其实,对于一棵树来说,我们在上面随便找一个点(可以是边上的点任意一点),也就是可以选无穷多个点,那么距离这个点最远的点一定是一条直径的一端。且任意一条直径都存在一个端点是距离这个点最远的点。
我们考虑距离任意一点x最远的点y,假设有一条直径是(a,b)。(下面我们用(a,b)来表示两点之间的路径,用|(a,b)|来表示这条路径的长度)。
那么我们分两种情况考虑。
如果 (a,b)(x,y)= ,如图。因为y距离x最远,所以 |(d,y)||(d,a)|,|(d,y)||(d,b)| ;因为(a,b)是直径,所以 |(b,c)||(c,y)|,|(a,c)||(c,y)| ,所以 |(d,y)||(b,d)|>|(b,c)||(c,y)|>|(d,y)| ,产生了矛盾,所以这种情况其实是不存在的。
如果 (a,b)(x,y) ,如图。因为y距离x最远,所以 |(d,y)||(d,b)| ,因为(a,b)是直径,所以 |(d,y)||(d,b)| ,所以 |(d,y)|=|(d,b)| 。即(a,y)也是一条直径。

根据这个性质就有一个经典的找直径的算法,就是随便找一个点找离它最远的点,那么它必然是一条直径的一端,而离它最远的点就是直径的另一端了,所以只需要两边dfs/bfs即可。

那么这一题需要说明的是对于两个点集S、T,任选 xS,yT ,则距离最远的(x,y)中存在 y{a,b} ((a,b)是T的一条直径),那么对称的x也一样。
其实在S中任选一个点x出发,设其在T中距离最远的点为y,(x,y)上最靠近x的存在于T中两点路径上的点为z。那么y显然必须是离z最远的点,而根据上面的分析,一条直径必然有一个端点是离z最远的点。

那么这个问题就变成了求出一段区间的直径,题解说是可以用线段树 O(logn) 预处理, O(1) 查询,我表示完全没看懂。。
我的做法是先用st表预处理出lca,因为合并两个区间的时候显然需要O(1)查询两点距离什么的。然后再用st表预处理出长为 2i 的区间的直径。时间复杂度 O(6nlogn)O(6m)

代码:

#include<cstdio>
#include<iostream>
using namespace std;
#include<algorithm>
void in(int &x){char c=getchar();while(c<'0'||c>'9')c=getchar();for(x=0;c>='0'&&c<='9';c=getchar())x=x*10+(c^'0');
}
const int N=1e5+5;
int next[N<<1],succ[N<<1],w[N<<1],ptr[N],etot=1;
void addedge(int from,int to,int wt){next[etot]=ptr[from],ptr[from]=etot,succ[etot]=to,w[etot++]=wt;
}const int Log=18;
int fa[N],depth[N];
int d[N<<1],dfn[N];
int Min(const int &a,const int &b){return depth[a]<depth[b]?a:b;
}
int dtot=1;
int dis[N];
int stack[N],cur[N];
void dfs(){stack[0]=1;depth[1]=1;for(int top=1,node;top--;){node=stack[top];//printf("-----%d----\n",node);if(cur[node]!=ptr[node]){d[dtot]=node;dfn[node]=dtot++;}if(cur[node]){++top;if(succ[cur[node]]!=fa[node]){depth[succ[cur[node]]]=depth[node]+1;dis[succ[cur[node]]]=dis[node]+w[cur[node]];fa[succ[cur[node]]]=node;stack[top++]=succ[cur[node]];}cur[node]=next[cur[node]];}}
}
int lca[Log][N<<1];
int lg[N<<1];
int querydis(int a,int b){if(dfn[a]>dfn[b])swap(a,b);int tmplg=lg[dfn[b]-dfn[a]+1],x=Min(lca[tmplg][dfn[a]],lca[tmplg][dfn[b]-(1<<tmplg)+1]);//printf("Min%d:(%d,%d)\n",tmplg,dfn[a],dfn[b]-(1<<tmplg)+1);//printf("dis(%d,%d),%d=%d\n",a,b,x,dis[a]+dis[b]-(dis[x]<<1));return dis[a]+dis[b]-(dis[x]<<1);
}
struct AS{int a[2];
}st[Log][N];
AS merge(const AS & u,const AS &v){int maxdis=querydis(u.a[0],u.a[1]),tmp;AS ans=u;if((tmp=querydis(v.a[0],v.a[1]))>maxdis){maxdis=tmp;ans=v;//printf("Get:%d\n",maxdis);}for(int i=2;i--;)for(int j=2;j--;)if((tmp=querydis(u.a[i],v.a[j]))>maxdis){maxdis=tmp;ans=(AS){u.a[i],v.a[j]};}//printf("merge((%d,%d),(%d,%d))=(%d,%d)\n",u.a[0],u.a[1],v.a[0],v.a[1],ans.a[0],ans.a[1]);return ans;
}
AS query(int l,int r){int tmplg=lg[r-l+1];//printf("[%d,%d]\n",l,r);//printf("merge(%d,(%d,%d))\n",tmplg,l,r-(1<<tmplg)+1);//printf("%d %d\n",st[tmplg][l].a[0],st[tmplg][l].a[1]);return merge(st[tmplg][l],st[tmplg][r-(1<<tmplg)+1]);
}
int main(){freopen("51noded.in","r",stdin);//freopen("51noded.out","w",stdout);int n;in(n);int x,y,z;for(int i=n;--i;){in(x),in(y),in(z);addedge(x,y,z),addedge(y,x,z);}dtot=1;for(int i=n;i;--i)cur[i]=ptr[i];dfs();//cout<<dfn[65536]<<endl;//cout<<d[68211]<<endl;/*puts("----dfn----");for(int i=1;i<dtot;++i)printf("%d ",d[i]);puts("");*///cout<<d[68211]<<endl;for(int i=dtot;--i;)lca[0][i]=d[i];for(int i=1,j=0;i<dtot;++i){lg[i]=j;if(i==1<<j+1)++j;}//cout<<lca[0][68211]<<endl;for(int j=1;j<Log;++j)for(int i=dtot-(1<<j);i>0;--i)lca[j][i]=Min(lca[j-1][i],lca[j-1][i+(1<<j-1)]);/*for(int j=0;j<Log;++j)for(int i=dtot-(1<<j);i>0;--i)printf("lca(%d,%d)=%d\n",j,i,lca[j][i]);*/for(int i=1;i<=n;++i)st[0][i]=(AS){i,i};for(int j=1;j<Log;++j)for(int i=n-(1<<j)+1;i>0;--i)st[j][i]=merge(st[j-1][i],st[j-1][i+(1<<j-1)]);//printf("%d %d\n",st[15][1].a[0],st[15][1].a[1]);//printf("%d %d\n",st[0][65895].a[0],st[0][65895].a[1]);//printf("%d %d\n",st[0][65896].a[0],st[0][65896].a[1]);//cout<<Min(lca[0][68211],lca[0][68211])<<endl;//testquery(65895,65895);int m;in(m);int a,b,c,d;AS s,t;while(m--){in(a),in(b),in(c),in(d);s=query(a,b),t=query(c,d);//printf("s=%d,%d\n",s.a[0],s.a[1]);//printf("t=%d,%d\n",t.a[0],t.a[1]);int maxdis=0;for(int i=2;i--;)for(int j=2;j--;)maxdis=max(maxdis,querydis(s.a[i],t.a[j]));printf("%d\n",maxdis);}
}

总结:
①一定要记得检查数组大小!
②对于树T的任意一条直径(a,b), xT ,必然有 max(|(a,x)|,|(b,x)|)max{|(x,y)}(yT) .

这篇关于BSG白山极客挑战赛D 解题报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350186

相关文章

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如

hdu1879(解题报告)

继续畅通工程                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)