废话
杭州是真的热的见鬼了……
光是走到学校就已经满头大汗了,但是虽然中午还热的一笔,却在下午来了一场小雨,这难道是要降温了吗!
祈祷一下它能降温吧……
进入正题
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 1≤l≤r≤5×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
1≤n≤5×105
1
≤
L
,
w
≤
1
0
9
1 \leq L,w \leq 10^9
1≤L,w≤109
【题解】
那个题解写的是真的玄学
这个题解先摆在这里:
题目描述
给定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 ≤ i ≤ n 1 \leq i \leq n 1≤i≤n,有 b i ∣ b i + n b_i|b_{i+n} bi∣bi+n , , , b i + n ∣ a i b_{i+n}|a_i bi+n∣ai
- ∏ 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=1nbi2≥∏i=1nbi+n
【样例输入】
5
3 2 4 5 5
【样例输出】
249
【数据规模】
1 ≤ n ≤ 100 1 \leq n \leq 100 1≤n≤100
1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109
【题解】
这题的转化真的是很秀。
首先感性地将这个约束条件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
1≤i≤n,假设我们现在找到了一组合法的
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=1∏nbi2<i=1∏nbi+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 x∗y=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即可。
今天下午老师花了半个小时左右讲了讲欧拉回路和哈密顿回路,虽然是因为中途加入,没听明白什么,但是好歹为以后的学习找到了点方向,所以收获也不小。
后面半个多小时讲上午的题,上面几个讲题人欢乐的很呐。。讲第三题的时候,这个讲一半,那个插进来,大手一挥,“我来讲我来讲”,于是将画图上的痕迹一抹而去,重新讲。最后听了半天,勉强是明白了第三题的一个重要的转化的思路,但是,讲题人却帅气的说:“讲完了,还有问题吗?”下面没人应他,于是,这题就过了。。。
因为实在太吵,而且第一题的做法也摸清楚了,第二题就没有继续听,偷偷溜回机房敲代码去了。
希望,明天等待我们的不再是模拟赛……