2020 Multi-University Training Contest 2

A. Total Eclipse

根据题意,每次要选择一个极大连通块,将里面所有数同时减小,直到最小值变成0,然后将变成0的点删除,分裂成多个连通块再接着做。

将整个过程倒过来看,变成按照b的值从大到小依次加入每个点。加入每个点x时遍历与x相连的所有边(x,y),如果yx之前加入且xy不连通则将xy合并,并将y所在连通块的树根的父亲设为x,得到一棵有根树。那么每个点x在成为最小值之前已经被做了bfatherx次操作,所以每个点x对答案的贡献为bxbfatherx

使用并查集支持路径压缩,时间复杂度O((n+m)logn)

  

B. Blood Pressure Game

将所有数字从小到大排序得到b1,b2,,bn,那么|aiaj|等价于排序后某些相邻段的差值bkbk1的区间和,可以将|ajaj1|表示成cnti(bibi1),即考虑每对排序后相邻的数(bi1,bi),统计bibi1对最终结果的贡献。

按照b1,b2,,bn的顺序依次将每个数字插入到最终的序列中,设f[i][j][t]表示考虑了前i个数,这i个数目前已经形成了j个连通块,其中有t(0t2)个数作为a1an的前k大方案以及对应的方案数,那么初始状态是f[1][1][0]b1不作为a1an,有一种方案)和f[1][1][1]b1作为a1an,有两种方案),目标是求出f[n][1][2]

对于f[i][j][t]f[i+1][][]的转移,则bi+1bi对最终结果的贡献是(2jt)(bi+1bi),有以下几种转移:

  • 新建一个不含a1an连通块,转移到f[i+1][j+1][t],有j+1t种方案。
  • 新建一个作为a1an连通块,转移到f[i+1][j+1][t+1],有2t种方案。
  • 合并两个连通块,转移到f[i+1][j1][t],有j1种方案。
  • 在某个连通块左侧或右侧扩展,且不作为a1an,转移到f[i+1][j][t],有2jt种方案。
  • 在某个连通块左侧或右侧扩展,且作为a1an,转移到f[i+1][j][t+1],有2t种方案。

对于每个状态,收集到所有转移后,将贡献相同的方案合并,然后保留前k大即可,使用快速排序的时间复杂度为O(n2klogk),使用归并的时间复杂度为O(n2k)

  

C. Count on a Tree II Striking Back

k[0,1]的随机实数的最小值的期望为1k+1。对于一个大小为k的集合,如果给每个元素随机一个正整数,那么多次采样得到的平均最小值越小就说明k的值越大。

回到本题,进行k次采样,每次采样时对每种颜色随机一个正整数,令每个点的点权为其颜色对应的随机数,然后统计询问的树链上点权的最小值,将k次采样的结果相加以粗略比较两条树链的颜色数的大小,因为不要求精确值所以k取几十即可得到正确结果。

使用树链剖分+线段树的时间复杂度为O(nk+mklog2n),使用全局平衡二叉树可以做到O(nk+mklogn)

  

D. Diamond Rush

如下图所示,令左上角为起点,右下角为终点,灰色部分为不可走的区域,那么任意一条合法路线必定经过了至少一个红点或绿点。

DP出起点到每个点的最长路径、终点到每个点的最长路径,相加以得到经过每个点的最长路径f[i][j],再预处理每一行的前后缀f的最大值,则每个询问可以O(1)回答。

最后的问题是如何处理权值非常大的情况。对于任意一个方案,令cnti表示该方案中经过了多少个权值为(n2)i的点,则比较两个方案的大小等价于比较字符串cntn2,cntn21,,cnt1的字典序大小。注意到DP的时候每个DP值对应的方案只会在之前某个DP值对应的方案中将某个cnt增加1,于是可以用可持久化线段树来记录cnt数组,并维护区间Hash值用于O(logn)比较大小。

时间复杂度O((n2+q)logn)

  

E. New Equipments

对于每个二次函数ai×j2+bi×j+ci,根据函数性质以及公式找到它在[1,m]中的最小值,并在最小值附近找到前n小的值,由工人i向这n个位置连边,则可以建出一张点数边数均为O(n2)的费用流图,然后直接增广n次找到流量=1,2,,n的最小费用流即可。因为左边任何一个大小为k(1kn)的子集都与右边至少nk个点相连,所以根据Hall定理一定存在完美匹配,又因为每个点都保留了最小的n个取值,所以一定可以找到最优解。

朴素SPFA实现的时间复杂度为O(n5),常数很小,使用Dijkstra费用流的时间复杂度为O(n3logn)

  

F. The Oculus

令修改的那一位为k,则要找到这个k满足A×B=C+Fk,其中k2000001。假设存在一个P满足F1,F2,,F2000001P两两不同余,则可以根据FkmodP=(A×BC)modP得到k。事实上取P=264,即自然溢出就是满足条件的。

  

G. In Search of Gold

二分答案,判断是否存在树直径长度不超过mid的方案。

考虑树DP,设f[i][j]表示考虑了i的子树,其中有j条边的取值来自a数组的所有树直径mid的方案中,与i点距离最远的点到i的距离的最小可能值。转移时合并之前已经DP过的部分和新加入的子树,如果两部分到i的最长距离之和超过mid则不转移,因为这表示树直径超过了mid

在转移时加上jmin(k,size[i])的剪枝,时间复杂度为O(nklogans)

  

H. Dynamic Convex Hull

考虑离线对操作序列按时间建立线段树,那么每个函数在时间轴上存在的部分一定是一个区间,将其作为标记插入线段树的O(logm)个节点中;对于每个询问,其在时间轴上对应一个点,那么它的答案对应的函数一定在线段树对应叶子节点到根这O(logm)个节点的标记之中,将其作为询问插入对应的O(logm)个节点中。

那么对于线段树的每个节点,它有若干标记和若干询问,这是一个静态的问题,对于每个询问x,分别找到aixaix的最优函数即可。

aix为例,考虑两个函数(xai)4+bi以及(xaj)4+bj,其中aiaj。如果i不比j优,则说明(xai)4+bi(xaj)4+bj,随着x的增大这个不等式将会一直成立,所以将函数按照a从小到大排序、将询问按照x从小到大排序,则最优决策具有单调性,可以分治求解。

时间复杂度O((n+m)log2m)

  

I. It's All Squares

对于每个询问,求出经过的点的横纵坐标的最小值和最大值,显然可以只在框出的矩形里做。在框出的矩形里递推出每个点往左边射线会经过多少次多边形的边界,则根据这个值的奇偶性可以判断出每个点是否在多边形里从而得到答案。

不妨设n,m同阶,当询问的形状是正方形时该算法的时间复杂度最大,令正方形的边长为k(kn),则消耗4k的输入量需要支付O(k2)的时间。所以最坏情况下需要支付O(|S|n4)的时间,这个值只有108左右,所以可以接受。

  

J. Lead of Wisdom

令第i种装备的数量为cnti,显然如果cnti不为0那么这一种装备不空的方案一定比空的方案优,在这时需要考虑的总方案数为max(cnti,1),其中cnti50。最坏情况下所有cnt的值都相同,令它们都等于k,则方案数为knk,当k3时取到最大值3n3,在n=50时并不算太大,因此可以直接爆搜所有方案得到最优解。

需要注意的是,cnti=0的部分应该直接跳过,以保证搜索树上每一层的节点数至少是上一层的两倍,使得时间复杂度为O(3n3),否则会退化成O(n3n3)而TLE。

  

K. King of Hot Pot

首先可以发现最优解可以增量构造,即往吃k份肉的最优解加入一份肉可以得到吃k+1份肉的最优解,因此存在一个顺序ord1,ord2,,ordn满足ord1,ord2,,ordk是吃k份肉的一个最优解吃的肉对应的集合。

假设确定了要吃哪些肉,那么肯定是按照捞出锅的时间从小到大吃。按照出锅时间从小到大依次考虑每份肉,在ord1,ord2,,ordi1中找到一个位置插入第i 份肉。令第i份肉的出锅时间为a,吃掉它的时间为b,设ord1,ord2,,ordi1里按照出锅时间顺序吃掉前k份肉ord1,ord2,,ordk所需的时间为tk,则将ordk替换成第i份肉后,对应的方案所需的时间为max(tk1,a)+b,如果max(tk1,a)+b<tk,则第i份肉应该插在ordk 之前。注意到满足条件的kord序列的一个后缀,所以可以二分找到对应的位置,将第i份肉插入ord序列,并将后面部分的t都修正为max(t,a)+b

为了加速这个过程,可以用平衡树维护ord序列,每个位置记录tk以及tk1方便二分,在修正tmax(t,a)+b时,根据t的单调性将t的一个区间赋值为a,再将一个后缀加上b。最后得到的t序列就是答案。

时间复杂度O(nlogn)

  

L. String Distance

考虑修改完毕后的A串和B串,它们对应位置的字符都相等,对于每一位:

  • 如果两个串在这一位都做了插入操作,那么可以同时不做插入操作使得操作次数减少2
  • 如果一个串A在这一位做了插入操作,另一个串B这一位不动,那么可以通过A这一位不动,B删除这一位达到同样的效果。

因此可以发现插入操作是没用的,所以两个串AB的距离等于|A|+|B|2LCS(A,B),其中LCS表示最长公共子序列。预处理出g[i][j]表示A[i..n]里字符j最早出现的下标。对于每个询问通过DP求出LCS,设f[i][j]表示与B[1..i]的公共序列长度达到jA[l..r]的最短前缀的长度,利用g数组进行转移。

时间复杂度O(26n+qm2)

  

posted @   Claris  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2020-01-14 BZOJ2988 : DIVISORS
2016-01-14 BZOJ4377 : [POI2015]Kurs szybkiego czytania
点击右上角即可分享
微信分享提示