【LGR-174-Div.2】洛谷 2 月月赛 II & FanOI Round 1 题解

[2A.似巨龙高歌]

容易发现,如果把 aia_iai 从小到大排序,那么 ai−ai+1≤0a_i-a_{i+1}\leq 0aiai+10,否则一定有一项 >0>0>0 ,因此我们从小到大排序,求相邻两项差的最大值即可。

[2B.陌路寻诗礼]

subtask 1\text{subtask 1}subtask 1

考虑假如我们知道那些边在最短路上,那贪心地让这些边的边权尽可能小,其余的边边权尽可能大即可,因此每条边只有两种取值 1/k1/k1/k ,我们 2m2^m2m 枚举每条边的选择然后验证即可。

复杂度 O(T2m(n+m))O(T2^m(n+m))O(T2m(n+m))

subtask 2\text{subtask 2}subtask 2

k=1k=1k=1 时,每条边取值唯一,可以用 bfsbfsbfs 求出 111 号点到每个点的最短路以及路径个数。

复杂度 O(n+m)O(n+m)O(n+m)

subtask 3\text{subtask 3}subtask 3

m−1m-1m1 时,因为 111 号点可以到达每个点,所以这是一棵以 111 为根的外向树。

那么到每个点的路径唯一,随便赋值都行。

subtask 4\text{subtask 4}subtask 4

k=109k=10^9k=109 时,最短路一定不会走这些边,我们相当于可以删一些边。

那么找出一棵以 111 为根的外向树,树上的边赋值为 111,剩下的赋值为 10910^9109 即可。

subtask 5\text{subtask 5}subtask 5

考虑一棵以 111 为根的最短路径树,树边赋值为 111,非树边赋值为 kkk ,那么到每个点的最短路就是树上的深度,记为 depxdep_xdepx

对于一条非树边 (ui,vi)(u_i,v_i)(ui,vi),我们要求 depvi<depui+kdep_{v_i}< dep_{u_i}+kdepvi<depui+k,否则这条边就在最短路上。

我们找出一棵 bfsbfsbfs 树,那么有性质:

  • 对于非树边 (ui,vi)(u_i,v_i)(ui,vi)depvi≤depui+1dep_{v_i}\leq dep_{u_i}+1depvidepui+1 ,否则不满足 bfsbfsbfs 的性质 。

因此,当 k>1k>1k>1 时,这棵 bfsbfsbfs 树自然就满足 depvi<depui+kdep_{v_i}<dep_{u_i}+kdepvi<depui+k ,符合要求。

否则,k=1k=1k=1,方案唯一,我们只需要验证就行了。

复杂度 O(n+m)O(n+m)O(n+m)

[2C/1A] 水影若深蓝

考虑把给出的 ui,viu_i,v_iui,vi 连边,形成一个图。

如果 nnn 个点都是连通的,那一定无解,因为树是一个二分图,黑白染色后 ui,viu_i,v_iui,vi 一定颜色相同,故不可能所有点颜色相同。

否则,至少有两个连通块,我们任选一个连通块,选择其内的任意一点 xxx,再从其他连通块任选一个点 yyy,然后构造一棵这样的树:

  • xxxyyy 连边

  • xxx 所在连通块的其他点与 yyy 连边

  • 剩下点和 xxx 连边

容易验证符合要求。

[2D/1B] 半彩三重奏

可以发现,对于给出的颜色 xi,yix_i,y_ixi,yi ,若树上不存在一条边 iii 满足 iii 两端点的颜色分别是 xi,yix_i,y_ixi,yi ,那么 xi,yix_i,y_ixi,yi 的点会形成若干独立的连通块,可以预处理后直接计算。

其余的颜色对一共最多只有 n−1n-1n1 种,就是每条边端点的颜色对集合。

首先把两端点颜色相同的边缩点。

枚举每一种可能的颜色对 xi,yix_i,y_ixi,yi,把树上这样的边连上,计算形成的连通块的大小的平方和即可。

使用哈希表存答案,然后建边后再树上跑 dfsdfsdfs,可以做到 O(n+m)O(n+m)O(n+m) ,如果使用 mapmapmap 或者并查集也能通过。

[1C] 龙逐千灯幻

subtask 1\text{subtask 1}subtask 1

dpi,jdp_{i,j}dpi,j 表示把前 iii 个位置划分成 jjj 段的最小代价,转移:

dpi,j=max⁡k=1idpk−1,j−1+f(k,i)dp_{i,j}=\max\limits_{k=1}^idp_{k-1,j-1}+f(k,i)dpi,j=k=1maxidpk1,j1+f(k,i)

其中 f(k,i)f(k,i)f(k,i) 为区间 [k,i][k,i][k,i] 内的颜色数,可以预处理出来。

询问是 O(1)O(1)O(1) 的,总复杂度 O(n3+m)O(n^3+m)O(n3+m)

subtask 2\text{subtask 2}subtask 2

有至少两个做法。

sol 1

优化第一部分的 dpdpdp,以 jjj 为阶段,那么我们只需要维护 dpk−1,j−1+f(k,i)dp_{k-1,j-1}+f(k,i)dpk1,j1+f(k,i) 的最大值。

开一棵线段树,第 kkk 个位置维护 gk=dpk−1,j−1+f(k,i)g_k=dp_{k-1,j-1}+f(k,i)gk=dpk1,j1+f(k,i) ,当我们 i→i+1i\to i+1ii+1 时:

  • gk+1=dpj−1,kg_{k+1}=dp_{j-1,k}gk+1=dpj1,k
  • ∀k>lsti+1,gk=gk+1\forall k>lst_{i+1},g_k=g_k+1k>lsti+1,gk=gk+1

其中 lstilst_ilstiiii 左边第一个等于 aia_iai 的数的下标,没有则为 000

上面的转移只需要线段树支持区间加即可。

询问还是 O(1)O(1)O(1) 的,总复杂度 O(n2log⁡n+m)O(n^2\log n+m)O(n2logn+m)

sol 2

我们不难证明 f(k,i)f(k,i)f(k,i) 满足四边形不等式,因此 dpdpdp 可以用决策单调性优化。

直接分治,两个指针移动来维护 f(k,i)f(k,i)f(k,i),总复杂度 O(n2log⁡n+m)O(n^2\log n+m)O(n2logn+m)

此外还有一些神秘的 O(n2)O(n^2)O(n2) 做法,不详述了。

subtask 3\text{subtask 3}subtask 3

因为 m=1m=1m=1,所以我们只需要解决一个询问。

可证明 dpi,jdp_{i,j}dpi,j 关于 jjj 是一个凸函数,这种区间划分问题的经典做法是 wqswqswqs 二分。

二分斜率 ccc,转移为:

dpi=max⁡dpk−1+f(k,i)−cdp_{i}=\max dp_{k-1}+f(k,i)-cdpi=maxdpk1+f(k,i)c

然后同上用线段树优化转移,复杂度 O(nlog⁡2n+m)O(n\log^2n+m)O(nlog2n+m)

subtask 4\text{subtask 4}subtask 4

我们考虑一下 wqswqswqs 二分的斜率 ccc

那么因为 ai≤30a_i\leq 30ai30 ,所以 f(k,i)≤30f(k,i)\leq 30f(k,i)30 ,那么当 c>30c>30c>30 时,f(k,i)−c<0f(k,i)-c<0f(k,i)c<0 ,此时切点一定是分一段,因此只有 c≤30c\leq 30c30ccc 有意义。

对于 c=0⋯30c=0\cdots 30c=030 各做一遍线段树优化 dpdpdp ,存下每个前缀的答案即可。

复杂度 O(max⁡ainlog⁡n+m)O(\max a_in\log n+m)O(maxainlogn+m)

subtask 5\text{subtask 5}subtask 5

上一个做法告诉我们,当 ccc 过大时,切点就会很小。

我们可以具体分析一下,设 F(k)=dp∗,k,D(k)=F(k)−F(k−1)F(k)=dp_{*,k},D(k)=F(k)-F(k-1)F(k)=dp,k,D(k)=F(k)F(k1),因为 FFF 是凸函数,所以 D(k)≥D(k+1)D(k)\geq D(k+1)D(k)D(k+1) 恒成立。

同时,因为 F(k)≤nF(k)\leq nF(k)n ,那么有 (k−1)D(k)≤∑i=2kD(i)≤F(k)−F(1)≤n(k-1)D(k)\leq \sum_{i=2}^k D(i)\leq F(k)-F(1)\leq n(k1)D(k)i=2kD(i)F(k)F(1)n,即 D(k)≤⌊nk−1⌋D(k)\leq \lfloor\frac{n}{k-1}\rfloorD(k)k1n

设斜率为 ccc 时的切点为 G(c)G(c)G(c) ,那么 F(G(c)−1)−c×(G(c)−1)≤F(G(c))−c×G(c)F(G(c)-1)-c\times (G(c)-1)\leq F(G(c))-c \times G(c)F(G(c)1)c×(G(c)1)F(G(c))c×G(c) ,即 F(G(c))−F(G(c)−1)≥cF(G(c))-F(G(c)-1)\geq cF(G(c))F(G(c)1)c ,$c\leq D(G©)\leq \lfloor \frac{n}{G©-1}\rfloor $ 。

我们取阈值 BBB

  • 对于 k≤Bk\leq BkB 的询问,我们可以预处理所有普通 dpdpdp 值。

  • 对于 k>Bk>Bk>B 的询问,根据上面的性质,G(c)≥kG(c)\geq kG(c)kccc 满足 c≤⌊nB⌋c\leq \lfloor\frac{n}{B} \rfloorcBn ,我们预处理这些 ccc 对应的

    dpdpdp 值。

都采用线段树优化 ,单次 dpdpdp 都是 O(nlog⁡n)O(n\log n)O(nlogn),取 B=nB=\sqrt nB=n,我们预处理的复杂度是 O(nnlog⁡n)O(n\sqrt n\log n)O(nnlogn)

询问时,前部分可以 O(1)O(1)O(1) 回答,后半部分可以直接二分,不过这样空间是 O(nn)O(n\sqrt n)O(nn) 的。

同时注意到 G(c)G(c)G(c) 是单调的,因此可以把询问按照 kkk 排序后,用一个指针维护转移点,空间就是线性了。

排序可以用桶排序,该做法时间复杂度 O(nnlog⁡n+m)O(n\sqrt n\log n+m)O(nnlogn+m) ,空间复杂度 O(n+m)O(n+m)O(n+m)

注意到线段树的常数比较大,如果被卡常可以把第一部分的 dpdpdp 换成决策单调性分治,因为访问时连续的所以常数小很多。

subtask 6\text{subtask 6}subtask 6

考虑能不能把线段树的 $\log $ 去掉。

观察一下我们实际需要支持的操作:

  • 向末尾加入一个数
  • 后缀加 111
  • 求最大值

维护一个单调递减的单调栈,那么 111 操作可以直接不断弹栈维护,333 操作就是查询栈底元素。

对于 222 操作,我们找到该后缀在单调栈上对应的位置,这个可以用并查集维护,然后相当于把这个部分往前面合并弹出若干元素,最后打上 +1+1+1 标记。

因为要支持中间弹出元素,所以我们用链表维护这个单调栈,至于 +1+1+1 标记,我们可以发现我们相当于只需要查询栈底,查询栈顶,查询某相邻两个位置的差值,因此直接维护单调栈内元素的差分值即可,打标记是简单的。

瓶颈在于并查集,因此单次 dpdpdp 的复杂度优化到了 O(nα(n))O(n\alpha (n))O(nα(n)),如果采用严格线性并查集,我们可以做到 O(n)O(n)O(n)

剩下部分不变,复杂度 O(nn+m)O(n\sqrt n+m)O(nn+m),空间 O(n+m)O(n+m)O(n+m) ,可以通过此题。

值得一提的是,在本题中你可以发现,我们优化单次 dpdpdp 和优化多次询问的部分是独立的,也就是说,我们把 f(l,r)f(l,r)f(l,r) 换成任意凸函数,在值域不大的情况下都可以在根号的代价内求出所有函数值。

[1D] 一径入繁华

对于 n=∏picin=\prod p_i^{c_i}n=pici,有:
σ0t(ns)=∏(1+s×ci)t \sigma_0^t(n^s)=\prod(1+s\times c_i)^{t} σ0t(ns)=(1+s×ci)t
然后设:
f(n)=∑d∣nμ(nd)σ0t(ns) f(n)=\sum_{d\mid n} \mu(\dfrac{n}{d})\sigma_0^t(n^s) f(n)=dnμ(dn)σ0t(ns)
所以有:
σ0t(ns)=∑d∣nf(d) \sigma_0^t(n^s)=\sum_{d\mid n}f(d) σ0t(ns)=dnf(d)
由于 σ0t\sigma_0^tσ0t 是积性函数,不妨先假设 n=pcn=p^cn=pc。则:
σ0t(pcs)=∑i=0cf(pi) \sigma_0^t(p^{cs})=\sum_{i=0}^{c}f(p^i) σ0t(pcs)=i=0cf(pi)
也就是说对于 n=pcn=p^cn=pcf(pc)f(p^c)f(pc)σ0t\sigma_0^tσ0t 关于 ccc 的差分。

类似的,设:
f(n)=∑d∣ng(d) f(n)=\sum_{d\mid n} g(d) f(n)=dng(d)
那个 gggfff 关于 ccc 的差分,即 gggσ0t\sigma_0^tσ0t 的二次差分。具体地就有:
g(pc)=(1+cis)t−[ci≥1]2(1+(ci−1)s)t+[ci≥2](1+(ci−2)s)t g(p^c)=(1+c_is)^t-[c_i\ge 1]2(1+(c_i-1)s)^t+[c_i\ge 2] (1+(c_i-2)s)^t g(pc)=(1+cis)t[ci1]2(1+(ci1)s)t+[ci2](1+(ci2)s)t
那么 ggg 是积性函数,就有:
g(n)=∏((1+cis)t−[ci≥1]2(1+(ci−1)s)t+[ci≥2](1+(ci−2)s)t) g(n)=\prod((1+c_is)^t-[c_i\ge 1]2(1+(c_i-1)s)^t+[c_i\ge 2] (1+(c_i-2)s)^t) g(n)=((1+cis)t[ci1]2(1+(ci1)s)t+[ci2](1+(ci2)s)t)
矩阵可以拆成:
ai,j=∑d∣gcd⁡(i,j)g(d)=∑d=0n[d∣i][d∣j]g(d)bi,j=[j∣i]g(j)ci,j=[i∣j]A=B∗C \begin{aligned} a_{i,j}&=\sum_{d\mid \gcd(i,j)}g(d)=\sum_{d=0}^{n}[d\mid i][d\mid j]g(d)\\\\ b_{i,j}&=[j\mid i]g(j)\\\\ c_{i,j}&=[i\mid j]\\\\ A&=B*C \end{aligned} ai,jbi,jci,jA=dgcd(i,j)g(d)=d=0n[di][dj]g(d)=[ji]g(j)=[ij]=BC
∗* 是矩阵乘法。B,CB,CB,C 都是上、下三角矩阵,故答案为:
det⁡A=∏m=1n∏((1+cis)t−[ci≥1]2(1+(ci−1)s)t+[ci≥2](1+(ci−2)s)t) \det A=\prod_{m=1}^{n}\prod((1+c_is)^t-[c_i\ge 1]2(1+(c_i-1)s)^t+[c_i\ge 2] (1+(c_i-2)s)^t) detA=m=1n((1+cis)t[ci1]2(1+(ci1)s)t+[ci2](1+(ci2)s)t)
依次考虑每个质数的贡献。

对于 p≤np\le \sqrt{n}pn 的部分暴力枚举 pppccc,暴力求快速幂,复杂度 O(nlog⁡n)\mathcal{O}(\sqrt{n}\log n)O(nlogn)

对于 p>np>\sqrt{n}p>n,可知 c≤1c\le 1c1,当 c=0c=0c=0 时贡献为 111 不用考虑,当 c=1c=1c=1g(p)=(1+s)t−2g(p)=(1+s)^t-2g(p)=(1+s)t2,故只需要筛素数个数即可,在本题范围内,使用 min25min25min25 筛即可。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值