link
T1 摆花
Problem
给出一个整数 n 和 m 个区间 [li,ri],要求往长度为 n 的序列 ai 中填数 x(0≤x≤n−1),其中 x 可以重复,求一种方案最大化 mex[ali,ari],输出这个最大值。
100%→n,m≤105,1≤li≤ri≤n
1s/512MB
Solution
答案为 min(ri−li+1),因为对于每一个区间来说最优方案肯定是从 0 到 ri−li+1。
时间复杂度 O(m)。
Summary
题面看成 x 不可以重复了,然后写的区间交,30pts。
T2 打饭
Problem
给出一个整数 k 和一个长度为 n 的序列 ai,构造出一组该序列的排列最小化 ∑i=1n−k∣ai−ai+k∣,输出这个最小值。
30%→n≤10
100%→n≤3×105,k≤min(n−1,5000),−109≤ai≤109
1s/512MB
Solution
问题等价于将这 n 个数分成 k 个组,找出排列最小化每个组的 max−min 之和,如下图是 n=8,k=3 时的分组情况:

那么将有 nmodk 个组会被分到 kn+1 个数(下文称为种类 1),k−nmodk 个组会被分到 kn 个数(下文称为种类 2)。
那么将原序列排个序,若要使 max−min 最小,那么每一个组的数必定会在排序后的序列中为连续的一段。
那么设 g1=nmodk,g2=k−nmodk,p1=kn+1,p2=kn,设 fi,j 为种类 1 的组已经分了 i 个,种类 2 的组已经分了 j 个的最小答案。
那么便有转移:
i<g1→fi+1,j=minfi,j+ap1(i+1)+p2j−ap1i+p2j+1j<g2→fi,j+1=minfi,j+ap1i+p2(j+1)−ap1i+p2j+1
答案显然为 fg1,g2,时间复杂度 O(nlogn+k2)。
Summary
暴力都还比预期少 10 分,20pts。
T3 小象砍树
Problem
给出一棵 n 个节点的无根树,每次可以选择一个度数为 1 的点并删掉,问多少种不同的方案可以将树删到只剩一个点,两种方式不同当且仅当至少有一步被删除的节点不同,方案数对 998244353 取模。
10%→n≤10
100%→n≤105
1s/512MB
Solution
设 fi 为以 i 为根的方案数。
显然,对于一个根来说,根节点一定最后删除,且一定在子节点都被删除之后,设以 i 为根的子树大小为 sizi,根节点的删除次序肯定比 sizi 要大,由于根节点的儿子节点删除起来无序,所以等价于 sizi−1 中选 sizj 个数,然后再把剩下的数留给下一个儿子节点。
又因为方案顺序是有序的,所以还要乘上对应的 fj,总的来说转移方程为:
fi=j∈soni∏fjCsizi−cnt−1sizj
换根转移:
fj=Cn−1sizjfiCn−1n−sizj
答案为 ∑i=1nfi,时间复杂度 O(nlogn)。
Summary
暴力,赛时想的换根转移组合推炸了,10pts。
T4 路径计数
Problem
给出一棵 n 个节点的完全二叉树并另外加了 m 条边,问图上有多少条不同的简单路径,答案对 109+7 取模。
简单路径指一条没有多次经过同一个点的路径(只有一个点的路径也是简单路径),两条路径不同当且仅当经过的边集不同或经过边的顺序不同,重边也算不同的边。
15%→m=0
100%→n≤109,m≤10,数据随机生成。
5s/512MB
Solution
二叉树不用直接建边,然后直接 DFS 即可。
WHY? 仅考虑 m 条边经过的顺序和方向,有 m!2m 种方案,而实际需要建出的节点数为 mlogn,故时间复杂度为 O(m!2m(mlogn)2),可以通过本题。
Summary
直接输出 n2mod(109+7),15pts。
T5 博物馆
Problem
给出一个 n 个点的边带权完全图,对于每一个点 x 来说,定义一条合法的路标(一些边),当且仅当所有点都能通过此路标到达 x,代价为(每个点到 x 的最小边权值)之和。对于每一个点,最小化代价。
20%→n≤8
100%→n≤3000,1≤wi,j≤109
1s/512MB
Solution
将所有边的边权减去最小的边权,将问题转化为求一条链上的代价和,对于一条路径来说,若权值出现递增且后面有富余的边,那么合并成一条显然更优,那么仅需跑一遍 Dijkstra 即可,为防止出现递增而没有富余的边的情况,需提前初始化 disti=min2gi,j。
时间复杂度 O(n2)。
Summary
暴力,20pts,考得太烂了。