背景:
杭州的天气够热的。
T1 \text{T1} T1:
que \text{que} que:
求
l
l
l至
r
r
r的所有合数的次大因子的和。
sol \text{sol} sol:
容易想到线性筛。
线性筛保证一个合数被一个最小的质因子筛到,那么最小的质因子对应的就是次大因子。
这样的暴力有
60pts
\text{60pts}
60pts了。
考虑映射,将
l
l
l至
r
r
r的贡献用数组映射到
1
1
1至
r
−
l
r-l
r−l上,因为合数
x
x
x不会被
x
\sqrt{x}
x之外的质数筛到,因此我们只需要用
1
1
1到
r
\sqrt{r}
r的质数来筛即可。
这样的做法有
80pts
\text{80pts}
80pts了。
考虑分块打表。
这样的水法有
100
pts
100\text{pts}
100pts了。
当然我 不 会告诉你正解是
min
\text{min}
min_
25
{25}
25筛。
code
\text{code}
code:
贴一份线性筛的部分代码吧。
bz[i*prime[j]]=true;
g[i*prime[j]]=i;
if(!(i%prime[j]))
{
bz[i]=true;
if(i!=prime[j]) g[i]=i/prime[j];
break;
}
T2 \text{T2} T2:
que \text{que} que:
给出一棵树,有边权,现在选出尽可能多的点,使得两两点对间的距离不小于
l
l
l,求你选的点的个数。
sol \text{sol} sol:
一眼想的是点分治。后来发现自己不会快速求一个图的最大的竞赛图的大小,就放弃了。
当然,权值为
1
1
1的数据还是可以贪心的。
具体来说就是找到树的直径的任意一个点,
dfs
\text{dfs}
dfs,每一次优先找拥有深度深的儿子更新。
时间复杂度:
Θ
(
n
2
)
\Theta(n^2)
Θ(n2),当然可以优化到
Θ
(
n
)
\Theta(n)
Θ(n)出解,只是根据题目数据范围描述来说没有必要。
这样就
20pts
\text{20pts}
20pts了。
以上都是废话。
正解是什么呢?
贪心。
假设你处理出了当前子树的根
x
x
x的儿子的答案,那么你每一次选出到
x
x
x距离最短的两个点(在
x
x
x的子树中选,可用权值线段树维护),看看这两个距离和能否大于
l
l
l,若不能,则删去距离小的哪一个点。
最后线段树合并儿子的堆即可。
最后堆的大小即为所求。
时间复杂度:
Θ
(
n
log
n
)
\Theta(n\log n)
Θ(nlogn)(当然有巨大常数)。
code \text{code} code:
咕咕咕
...
\text{...}
...
或许有空会补。
T3 \text{T3} T3:
que \text{que} que:
给出长度为
n
n
n的序列
a
a
a,求长度为
2
n
2n
2n的序列
b
b
b的个数满足一下两个约束条件:
∀
i
∈
[
1
,
n
]
,
b
i
∣
b
i
+
n
,
b
i
+
n
∣
a
i
∀i∈[1,n],b_i|b_{i+n},b_{i+n}|a_i
∀i∈[1,n],bi∣bi+n,bi+n∣ai
∀ i ∈ [ 1 , n ] , ∏ i = 1 n b i + n ≤ ∏ i = 1 n b i 2 ∀i∈[1,n],\prod_{i=1}^{n}b_{i+n}≤\prod_{i=1}^{n}b_i^2 ∀i∈[1,n],i=1∏nbi+n≤i=1∏nbi2
sol \text{sol} sol:
∏ i = 1 n b i + n ≤ ∏ i = 1 n b i 2 \prod_{i=1}^{n}b_{i+n}≤\prod_{i=1}^{n}b_i^2 i=1∏nbi+n≤i=1∏nbi2
∏ i = 1 n b i + n b i 2 ≤ 1 \prod_{i=1}^{n}\frac{b_{i+n}}{b_i^2}≤1 i=1∏nbi2bi+n≤1
∏ i = 1 n 1 b i b i + n b i ≤ 1 \prod_{i=1}^{n}\frac{1}{b_i}\frac{b_{i+n}}{b_i}≤1 i=1∏nbi1bibi+n≤1
因为
b
i
∣
b
i
+
n
b_i|b_{i+n}
bi∣bi+n,因此不妨设
t
i
=
b
i
+
n
b
i
t_i=\frac{b_{i+n}}{b_i}
ti=bibi+n,则有
b
i
=
b
i
+
n
t
i
b_i=\frac{b_{i+n}}{t_i}
bi=tibi+n,从而:
∏
i
=
1
n
1
b
i
+
n
t
i
t
i
≤
1
\prod_{i=1}^{n}\frac{1}{\frac{b_{i+n}}{t_i}}t_i≤1
i=1∏ntibi+n1ti≤1
∏ i = 1 n ( b i + n t i ) − 1 t i ≤ 1 \prod_{i=1}^{n}(\frac{b_{i+n}}{t_i})^{-1}t_i≤1 i=1∏n(tibi+n)−1ti≤1
因为
t
i
t_i
ti与
b
i
+
n
t
i
\frac{b_{i+n}}{t_i}
tibi+n有对称性,所以有:
∏
i
=
1
n
(
b
i
+
n
t
i
)
−
1
t
i
≥
1
\prod_{i=1}^{n}(\frac{b_{i+n}}{t_i})^{-1}t_i≥1
i=1∏n(tibi+n)−1ti≥1
因此我们只需要求:
∏
i
=
1
n
(
b
i
+
n
t
i
)
−
1
t
i
=
1
\prod_{i=1}^{n}(\frac{b_{i+n}}{t_i})^{-1}t_i=1
i=1∏n(tibi+n)−1ti=1