[GDKOI2023 提高组] 游戏 题解

news/2025/9/19 22:11:06/文章来源:https://www.cnblogs.com/hnczy/p/19101777

一种比较简短的写法:

拉出直径,再在直径的每一个点上跑一下最长链,为 $ mx_i$

这里设三点的路径交点为 \(rt\)

假设 \(rt \rightarrow u,v,w\) 的距离为 \(dis1,dis2,dis3\)

容易知道 \(dis1 = (x+y-z)/2,dis2 = (-x+y+z)/2,dis3 = (x-y+z)/2\)

在直径上的 \([dis1+1,len-dis2]\) 中选择 \(mx\) 最大值判断是否大于等于 \(dis3\)

若成立,则在 \([dis2+1,len-dis1]\) 中选择 \(mx\) 最大值判断是否大于等于 \(dis3\)

明显这样做是在 \(dis1\ge dis2\ge dis3\) 时成立,若 \(dis1,dis2,dis3\) 不满足递减关系,先排序,最后调整关系即可。

时间复杂度 \(O(n \log n +q)\),常熟较小,比次优解快一半。

放一个未卡常的个人觉得比较清新的代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2E5+5;
int n,q,dep[N],rt,fa[N],st[N][21],mx[N],lg[N],vis[N],a[4],b[4];
vector<int>e[N],g,h[N];
int get(int x,int y){return mx[x]>mx[y]?x:y;
}
void dfs(int u,int F){fa[u]=F;dep[u]=dep[F]+1;if(dep[u]>dep[rt])rt=u;for(int v:e[u])if(v!=F&&!vis[v])dfs(v,u);
}
int query(int l,int r){int tmp=lg[r-l+1];return get(st[l][tmp],st[r+1-(1<<tmp)][tmp]);
}
bool cmp(int x,int y){return a[x]>a[y];
}
int main(){freopen("game.in", "r", stdin);freopen("game.out", "w", stdout);scanf("%d",&n);for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);e[u].push_back(v),e[v].push_back(u);}dfs(1,0);dfs(rt,0);while(rt)vis[rt]=1,g.push_back(rt),rt=fa[rt];for(int i=0;i<g.size();i++){int x=g[i];rt=0;dep[0]=-1;st[i+1][0]=i;dfs(x,0);mx[i]=dep[rt];while(rt)h[i].push_back(rt),rt=fa[rt];reverse(h[i].begin(),h[i].end());}for(int i=1;i<=20;i++)for(int j=1;j+(1<<i-1)<=g.size();j++)st[j][i] = get(st[j][i-1],st[j+(1<<i-1)][i-1]);for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;scanf("%d",&q);while(q--){int u,v,w;for(int i=1;i<=3;i++)scanf("%d",a+i),b[i]=i;sort(b+1,b+4,cmp);int tmp1= (a[b[1]] + a[b[2]] - a[b[3]])/2;int tmp2= a[b[1]] - tmp1;int tmp3= a[b[2]] - tmp1;int tmp= query(tmp1+1,g.size()-tmp2);if(mx[tmp] >= tmp3){u = g[tmp-tmp1];v = g[tmp+tmp2];w = h[tmp][tmp3];} else {tmp= query(tmp2+1,g.size()-tmp1);v = g[tmp-tmp2];u = g[tmp+tmp1];w = h[tmp][tmp3];}if (b[1] == 1 && b[2] == 2)printf("%d %d %d\n", u, v, w);if (b[1] == 1 && b[2] == 3)printf("%d %d %d\n", v, u, w);if (b[1] == 2 && b[2] == 1)printf("%d %d %d\n", u, w, v);if (b[1] == 2 && b[2] == 3)printf("%d %d %d\n", v, w, u);if (b[1] == 3 && b[2] == 1)printf("%d %d %d\n", w, u, v);if (b[1] == 3 && b[2] == 2)printf("%d %d %d\n", w, v, u);}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP-J/S 2025 游记

突然发现今年忘记写游记了…… [2025.6.30,2025.8.1) 中考。 [2025.8.1,2025.8.31] 暑假集训 15 天,一天比赛一天专题。早上 8:00 到机房训到 12:00 然后和高三抢饭,下午 14:00-17:00 继续搞,晚上 19:00-22:00。只有…

2025.9.19 计数dp小记

[CQOI2011] 放棋子 本题有一个性质,棋子间互不关联,又因为数据范围小,很容易 \(dp\) 记 \(f_{p,i,j}\) 表示考虑前 \(p\) 种颜色,放了 \(i\) 行 \(j\) 列的方案数 则枚举 \(p\) 放了几行几列,有 \[f_{p,i,j} = \s…

实用指南:AI推理范式:从CoT到ReAct再到ToT的进化之路

实用指南:AI推理范式:从CoT到ReAct再到ToT的进化之路pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

sign up - Gon

如果注册github时出现 Unable to verify your captcha response. Please visit https://docs.github.com/articles/troubleshooting-connectivity-problems/#troubleshooting-the-captcha for troubleshooting informa…

ctfshow web入门 信息搜集

有些题目会了就没写了,只记录一下自己不会写的题目,不过信息搜集还是很重要的ctfshow web3(自带网络工具包查看数据)查看源码什么也没有扫目录也什么都没有只能说信息收集能力还欠佳, 我们可以先尝试使用浏览器自带…

完整教程:数据结构:单链表的应用(力扣算法题)第二章

完整教程:数据结构:单链表的应用(力扣算法题)第二章pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

CF2039E Shohag Loves Inversions

CF2039E Shohag Loves Inversions 题意: 给你一个数列,初始数列为 $ a = [0, 1] $ ,现在重复进行以下操作若干次:将当前数组中逆序对个数 \(k\) 插入当前数组中任意一个位置,包括开头或者结尾。其中 \(n\le 1e6\)…

深入解析:sqlite3的加解密全过程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

U522155 板垣 カノエ is WATCHING YOU std

U522155 板垣 カノエ is WATCHING YOU #include<bits/stdc++.h> #define int long long #define add(a,b) to[++ tot] = b,nxt[tot] = h[a],h[a] = tot #define con putchar_unlocked( ) #define ent putchar_u…

ctfshow web

ctfshow里面免费的web题不写白不写ctf.show_红包题第二弹1打开题目显示这样 看看源码有无提示可以看到提示了cmd参数,那我们就随便传点东西看看会有什么回显又是代码审计,可以看到大小写字母过滤后只有小写p可以使用…

代码随想录算法训练营第三天 | leetcode 203 707 206

203移除链表元素 注意事项:java语言的访问链表和数据用的是".",空指针是小写的null。在删除链表时先对表头进行判断避免表头是null和表头元素是要删除的元素,下面进行循环寻找时要注意判断指针的下一个指针…

Codeforces Round 1051 (Div. 2) A~D2

A. All Lengths Subtraction 思维。 每次选择长度为 \(k(k \in [1,n])\) 的区间减 \(1\),那么第一个首选的就是 \(a_i = n\) 的 位置,然后维护 \(n\) 所在的区间,检查 \(n-k+1\) 是否在其两边,有的话就扩大区间,否…

【F#学习】数组:Array

Array 在F#中, 一个数组(Array)包含0个或多个元素,长度固定,但内容可以改变。元素需要具有相同的类型。 // 声明一个数组。注意看清操作符是 [| 和 |] let empty = [| |] let emptyAlternative = Array.emptylet …

CTFWEB姿势总结

CTFWEB姿势总结 RCE 尝试是否有命令执行漏洞 示例 payload 思路(Linux 为例):简单命令report; whoami report|whoami report$(whoami)如果 URL 执行后页面输出了你的用户名(例如 www-data),说明命令执行存在。 W…

详细介绍:架构思维:分布式缓存实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

规模化加速AI:从用户、开发者到企业的深度策略解析

本文深入探讨了加速AI系统的三大维度:终端用户追求的实时响应体验、开发者面临的数据与硬件瓶颈解决方案,以及企业关注的投产效率与合规性。文章详细分析了边缘推理、模型压缩、多云GPU调度等关键技术策略,并引用行…

ctfshow 菜狗杯

没想到在菜狗杯写到了qq列表里的佬出的题ctfshow 小舔田? <?php include "flag.php"; highlight_file(__FILE__);class Moon{public $name="月亮";public function __toString(){return $thi…

详细介绍:测试用例详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

国际服务器(VPS):泰国、印尼、菲律宾、马来西亚、香港、台湾、新加坡、日本、美国、英国等。

VPS 国际服务器(VPS):泰国、印尼、菲律宾、马来西亚、香港、台湾、新加坡、日本、美国、英国等。 mleo.siteVPS推荐 泰国、印尼、韩国、菲律宾、马来西亚、亚太等 Lightnode:1C2G-$7.71/Month 美国(Month) CloudCo…

缓存常见问题

缓存常见问题 缓存穿透 概念: 查询缓存中没有,数据库也没有的数据,大量的请求都穿透了缓存层直达数据库,导致数据库因压力过大而宕机。 本质是一种人为攻击手段。 解决方案:数据库不存在数据时,存放一个临时数据到缓存…