杭二学习Day1——比赛

背景:

杭州的天气够热的。

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 rl上,因为合数 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],bibi+n,bi+nai

∀ 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=1nbi+ni=1nbi2

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=1nbi+ni=1nbi2

∏ i = 1 n b i + n b i 2 ≤ 1 \prod_{i=1}^{n}\frac{b_{i+n}}{b_i^2}≤1 i=1nbi2bi+n1

∏ 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=1nbi1bibi+n1

因为 b i ∣ b i + n b_i|b_{i+n} bibi+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=1ntibi+n1ti1

∏ 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=1n(tibi+n)1ti1

因为 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=1n(tibi+n)1ti1

因此我们只需要求:
∏ 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=1n(tibi+n)1ti=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值