出题&题解

18 篇文章 0 订阅
17 篇文章 0 订阅

Task1

这里写图片描述

比较简单的一题。
关于pi的指数,我们只用观察被pi整除的数,被pi^2整除的数……它们的和组成了pi的指数。
当然找的时候可以各种优化。

Task2

这里写图片描述
显然dp
我们倒着来,dp[i]表示第i个车站与后面所有车站的p的和。
ans=Σi=1,n dp[i]
转移的时候找到可以只买一次票到达的dp值最小的车站然后显然对于它可以到达的车站当前车站的cost都要加1,而当前车站可以一次到达的车站不用加。
所以不是单纯地找dp值小的,而是找最远的并且dp值最小的。
在建数据结构的时候把位置也加入去query

Task3

n个同学组成了一棵树。现在班主任来了。树上有两个点是机房。问所有同学躲进机房最少要花多少时间。假设树上每条边都要花费1的时间。

这道题我是用倍增写的。
首先我们找到到达两个点距离相同的点g。(没有相同的差1也行)
然后我们就可以把图给分成两块。
然后在两个块里分别找到离两个节点最远的点。
关于如何查询,我用的是倍增。
一开始我们先预处理3个倍增数组。
一个是lca用的f数组。
一个存当前节点向上可以到达的节点离他最远的子孙的值(这个子孙不可以是当前节点的子孙)
这样就可以保证查找的方便性。
一个存当前节点向上可以到达的节点离他最远的子孙剪掉当前节点的父亲的深度*2。
如果觉得*2比较奇怪请听我说。
原因是这样的:
我们假如一开始存的是…-深度*1
那么这个东西就会是当前节点对应的最长子链的长度。
然后我们在一个节点向上up的时候找到最长的子链长度,然后扫过去以后我们只知道长度却不知道这个最长的子链的顶端在哪。
不如我们直接剪掉深度的两倍,这样在查询完mx之后再加上查询顶点的深度就是你要找的最长链的长度了。
如果还没有理解自己画一棵树模拟一下查询的过程。
在g下面向上瞎逼倍增就可以很快地搞出来。
在面的时候就有点麻烦了。所以此时需要从g往上倍增查询。
细节很多无法一一赘述,请自行模拟。
然后大概就好了。
前前后后不过4、5个小时==

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值