[2A.似巨龙高歌]
容易发现,如果把 aia_iai 从小到大排序,那么 ai−ai+1≤0a_i-a_{i+1}\leq 0ai−ai+1≤0,否则一定有一项 >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-1m−1 时,因为 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}+1depvi≤depui+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,然后构造一棵这样的树:
-
xxx 与 yyy 连边
-
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-1n−1 种,就是每条边端点的颜色对集合。
首先把两端点颜色相同的边缩点。
枚举每一种可能的颜色对 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=maxk=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=1maxidpk−1,j−1+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)dpk−1,j−1+f(k,i) 的最大值。
开一棵线段树,第 kkk 个位置维护 gk=dpk−1,j−1+f(k,i)g_k=dp_{k-1,j-1}+f(k,i)gk=dpk−1,j−1+f(k,i) ,当我们 i→i+1i\to i+1i→i+1 时:
- gk+1=dpj−1,kg_{k+1}=dp_{j-1,k}gk+1=dpj−1,k
- ∀k>lsti+1,gk=gk+1\forall k>lst_{i+1},g_k=g_k+1∀k>lsti+1,gk=gk+1
其中 lstilst_ilsti 为 iii 左边第一个等于 aia_iai 的数的下标,没有则为 000 。
上面的转移只需要线段树支持区间加即可。
询问还是 O(1)O(1)O(1) 的,总复杂度 O(n2logn+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(n2logn+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=maxdpk−1+f(k,i)−cdp_{i}=\max dp_{k-1}+f(k,i)-cdpi=maxdpk−1+f(k,i)−c
然后同上用线段树优化转移,复杂度 O(nlog2n+m)O(n\log^2n+m)O(nlog2n+m) 。
subtask 4\text{subtask 4}subtask 4
我们考虑一下 wqswqswqs 二分的斜率 ccc 。
那么因为 ai≤30a_i\leq 30ai≤30 ,所以 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 30c≤30 的 ccc 有意义。
对于 c=0⋯30c=0\cdots 30c=0⋯30 各做一遍线段树优化 dpdpdp ,存下每个前缀的答案即可。
复杂度 O(maxainlogn+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(k−1),因为 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(k−1)D(k)≤∑i=2kD(i)≤F(k)−F(1)≤n,即 D(k)≤⌊nk−1⌋D(k)\leq \lfloor\frac{n}{k-1}\rfloorD(k)≤⌊k−1n⌋ 。
设斜率为 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 Bk≤B 的询问,我们可以预处理所有普通 dpdpdp 值。
-
对于 k>Bk>Bk>B 的询问,根据上面的性质,G(c)≥kG(c)\geq kG(c)≥k 的 ccc 满足 c≤⌊nB⌋c\leq \lfloor\frac{n}{B} \rfloorc≤⌊Bn⌋ ,我们预处理这些 ccc 对应的
dpdpdp 值。
都采用线段树优化 ,单次 dpdpdp 都是 O(nlogn)O(n\log n)O(nlogn),取 B=nB=\sqrt nB=n,我们预处理的复杂度是 O(nnlogn)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(nnlogn+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)=d∣n∑μ(dn)σ0t(ns)
所以有:
σ0t(ns)=∑d∣nf(d)
\sigma_0^t(n^s)=\sum_{d\mid n}f(d)
σ0t(ns)=d∣n∑f(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=0∑cf(pi)
也就是说对于 n=pcn=p^cn=pc,f(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)=d∣n∑g(d)
那个 ggg 是 fff 关于 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−[ci≥1]2(1+(ci−1)s)t+[ci≥2](1+(ci−2)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−[ci≥1]2(1+(ci−1)s)t+[ci≥2](1+(ci−2)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=d∣gcd(i,j)∑g(d)=d=0∑n[d∣i][d∣j]g(d)=[j∣i]g(j)=[i∣j]=B∗C
∗*∗ 是矩阵乘法。B,CB,CB,C 都是上、下三角矩阵,故答案为:
detA=∏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=1∏n∏((1+cis)t−[ci≥1]2(1+(ci−1)s)t+[ci≥2](1+(ci−2)s)t)
依次考虑每个质数的贡献。
对于 p≤np\le \sqrt{n}p≤n 的部分暴力枚举 ppp 和 ccc,暴力求快速幂,复杂度 O(nlogn)\mathcal{O}(\sqrt{n}\log n)O(nlogn)。
对于 p>np>\sqrt{n}p>n,可知 c≤1c\le 1c≤1,当 c=0c=0c=0 时贡献为 111 不用考虑,当 c=1c=1c=1 时 g(p)=(1+s)t−2g(p)=(1+s)^t-2g(p)=(1+s)t−2,故只需要筛素数个数即可,在本题范围内,使用 min25min25min25 筛即可。
1276

被折叠的 条评论
为什么被折叠?



