混进杭二训练——Day1

废话

杭州是真的热的见鬼了……

光是走到学校就已经满头大汗了,但是虽然中午还热的一笔,却在下午来了一场小雨,这难道是要降温了吗!

祈祷一下它能降温吧……

进入正题

T1

【题目大意】

求区间 [ l , r ] [l,r] [l,r] 中的合数的次大因子之和。
8 8 8 的次大因子就是 4 4 4

【样例输入】

1 10

【样例输出】

17

极不友好的【数据范围】

1 ≤ l ≤ r ≤ 5 × 1 0 9 1\leq l \leq r \leq 5 \times 10^9 1lr5×109

【题解】
分段打表,裸的。

好后悔之前居然没学这个高端的东西,这里有一道例题

这里还是详细讲讲。(这里的笔记为个人感悟,因为根本就没听到讲题人在说什么qwq 当时实在是吵。。,所以,有什么讲的不好见见谅)

它可以处理这样的一类问题:

设有这样一个函数 f ( x ) = w u l a l a f(x)=wulala f(x)=wulala,求 ∑ i = 1 n f ( i ) \sum_{i=1}^n f(i) i=1nf(i)

f f f 函数很难求怎么办?不重要。

要是复杂度爆炸呢?不重要。

只有一个要求——能把 f f f 函数求出来就行。至于时间复杂度,不重要

因为,我们不是在码正解,我们只是答案的搬运工。

不管你以什么方式,只要能把 f f f 函数的这个表打出来,那么这道题就算是AC一半了。

没错,先老老实实打表。

千辛万苦把表造出来之后,发现这个表太大了无法应用。

考虑压缩。

如何压缩?

考虑分块

因为数据规模只有 5 × 1 0 9 5\times 10^9 5×109,开方之后,微不足道。

于是,我们将这个表分块,把答案压缩起来,最后像分块一样查询答案即可。

那么显然,这道题就是分段打表的裸题了。

T2

【题目大意】

给一棵树,有一个集合 S S S,满足 S S S 中任意两点在树中的距离都大于等于 L L L,现在要使这个集合尽可能大,问最大能多大。

输入格式:先是 n,L,然后是n-1条边,每条边形如u , v , w,表示u和v之间有一条长度为w的边。

【样例输入】

4 5
1 2 3
2 3 3
3 4 5

【样例输出】

3

【数据范围】

1 ≤ n ≤ 5 × 1 0 5 1 \leq n \leq 5 \times 10^5 1n5×105
1 ≤ L , w ≤ 1 0 9 1 \leq L,w \leq 10^9 1L,w109

【题解】

那个题解写的是真的玄学

这个题解先摆在这里:

题目描述
给定n个节点的树 ,要求在树上选择一个点集S,满足点集中的点距离两两之间均不小于L,要求最大化S并输出|S|,即点集S的大小
题解
考虑贪心,假设对于i的子树的答案,我们已经预处理出了i的所有孩子所对子树的答案,那么可以考虑贪心, 每次取出距离i号节点最近的2个节点,若其距离和小于L,那么删去最小的,直接维护复杂度为O(n^2)考虑利用线段树+启发式合并进行优化,复杂度为O(nlog2n)
由于数据随机,树高只有logn ,可以暴力进行归并排序,复杂度为O(nlogn)正解可以利用线段树合并或者左偏树合并堆进行维护,线段树合并可能常数较大不能通过,复杂度为O(nlogn)

我已经尽可能去理解这个东西了,要是写错了概不负责我也没办法了qwq。

那么详细讲讲上面这个东西:

现在假设x节点的儿子们都已经求出了答案(即找到了最大的合法点集,这个点集用可并堆维护,每个节点的权值为它到当前根的距离,造一个小根堆),那么现在取离x最近的两个节点(这两个节点要从儿子们的答案中取,并且要来自两个不同的儿子(这里如果想不明白为什么的话可以结合点分治的求解来思考一下)),假如他们之间的距离小于L,那么就删掉他们两个中离x更近的那一个(因为它更容易和别的点冲突,导致点集越来越小)。重复以上操作,直到只剩一个儿子中还有点或离x最近的两个点的距离大于等于L就停止。

然后将儿子们的答案合并起来。

最后看离x最近的那个节点到x的距离,假如大于等于L,那么将x也放入答案中。

然后走向x的父亲,重复上述操作。

这样看来,这个贪心貌似的确是正确的。

T3

我回来填坑了。(之前咕了3天

这道题真的是很玄学,题解最后一句话用了半天才理解。今天早上突然豁然开朗就赶紧记下来了。

【题目大意】

给你一个长度为 n n n的序列 a a a,现在问你有多少个长度为 2 n 2n 2n的序列 b b b满足这样的条件:

  1. 对于 1 ≤ i ≤ n 1 \leq i \leq n 1in,有 b i ∣ b i + n b_i|b_{i+n} bibi+n , , , b i + n ∣ a i b_{i+n}|a_i bi+nai
  2. ∏ i = 1 n b i 2 ≥ ∏ i = 1 n b i + n \prod_{i=1}^n b_i^2\geq \prod_{i=1}^n b_{i+n} i=1nbi2i=1nbi+n

【样例输入】

5
3 2 4 5 5

【样例输出】

249

【数据规模】

1 ≤ n ≤ 100 1 \leq n \leq 100 1n100

1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

【题解】

这题的转化真的是很秀。

首先感性地将这个约束条件2拆开,约束条件就变成了:

满足 ∏ i = 1 n b i 2 > ∏ i = 1 n b i + n \prod_{i=1}^n b_i^2> \prod_{i=1}^n b_{i+n} i=1nbi2>i=1nbi+n   o r or or   ∏ i = 1 n b i 2 = ∏ i = 1 n b i + n \prod_{i=1}^n b_i^2= \prod_{i=1}^n b_{i+n} i=1nbi2=i=1nbi+n

先不管后面那个约束条件,先看前面这个。

对于 1 ≤ i ≤ n 1 \leq i \leq n 1in,假设我们现在找到了一组合法的 b b b,满足上面两个条件。现在对 b 1 b_1 b1~ b n b_n bn做一个转化,使得 b i = b i + n b i b_i=\frac {b_{i+n}}{b_i} bi=bibi+n,显然,转化过后 b i b_i bi仍然是整数,我们称+这个转化过后的这个序列为对应序列。显然,每一组合法的序列 b b b对应序列满足这样一个性质:
∏ i = 1 n b i 2 < ∏ i = 1 n b i + n \prod_{i=1}^n b_i^2< \prod_{i=1}^n b_{i+n} i=1nbi2<i=1nbi+n

证明:

b ′ b' b b b b的对应序列。

x = ∏ i = 1 n b i x=\prod_{i=1}^n b_i x=i=1nbi , y = ∏ i = 1 n b i ′ y=\prod_{i=1}^n b'_i y=i=1nbi , z = ∏ i = 1 n b i + n z=\prod_{i=1}^n b_{i+n} z=i=1nbi+n

显然满足 x ∗ y = z x*y=z xy=z

∵ x 2 > z \because x^2> z x2>z

∴ x > z \therefore x > \sqrt z x>z

∴ y < z \therefore y < \sqrt z y<z

∴ y 2 < z \therefore y^2 < z y2<z

证毕。

于是我们发现,每一个合法的 b b b 序列,都一定有一个对应序列,且这个对应序列不合法。

也就是说,在所有满足条件 1 1 1 的方案中,去掉等于的方案后,剩下的方案中,选到大于的方案的概率和选到小于的方案的概率是相同的,换句话说,各占一半。

于是假如能求出等于的方案数,用总方案数减去它再除 2 2 2,就得到大于的方案数了。

现在问题只剩一个:如何求等于的方案数?

注意到,如果 ∏ i = 1 n b i + n \prod_{i=1}^n b_{i+n} i=1nbi+n 是完全平方数,那么肯定存在 ∏ i = 1 n b i \prod_{i=1}^n b_i i=1nbi,所以取出 a i a_i ai 的平方因子做一下dp即可。


今天下午老师花了半个小时左右讲了讲欧拉回路和哈密顿回路,虽然是因为中途加入,没听明白什么,但是好歹为以后的学习找到了点方向,所以收获也不小。

后面半个多小时讲上午的题,上面几个讲题人欢乐的很呐。。讲第三题的时候,这个讲一半,那个插进来,大手一挥,“我来讲我来讲”,于是将画图上的痕迹一抹而去,重新讲。最后听了半天,勉强是明白了第三题的一个重要的转化的思路,但是,讲题人却帅气的说:“讲完了,还有问题吗?”下面没人应他,于是,这题就过了。。。

因为实在太吵,而且第一题的做法也摸清楚了,第二题就没有继续听,偷偷溜回机房敲代码去了。

希望,明天等待我们的不再是模拟赛……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值