A. Ascending Rating 按照r从m到n的顺序很难解决这个问题。 考虑按照r从n到m的顺序倒着求出每个区间的答案。按照滑窗最大值的经典方法维护a的单调队列,那么队列中的元素个数就是最大值的变化次数。 时间复杂度O(n)。
B. Cut The String 一个字符串的所有回文后缀一定是它的最长回文后缀的所有border。一个字符串的所有border按照长度排序后可以用O(logn)个等差数列表示。利用回文树可以直接得到每个前缀的最长回文后缀,稍加修改即可得到O(logn)个等差数列表示的所有回文后缀。 用两棵回文树预处理出每个前缀的回文后缀集合fi以及每个后缀的回文前缀集合gi。 对于一个询问l,r,枚举gl以及fr的两个等差数列,扩展欧几里得求出方案数,时间复杂度O(mlog3n),不能接受。 在扩展欧几里得之前根据上下界粗判即可去掉一个O(logn),因为只有O(logn)对等差数列的上下界相交。 时间复杂度O(mlog2n)。
C. Dynamic Graph Matching 设f[i][S]表示前i次操作之后,S集合的点已经匹配的方案数。 对于加边操作,显然f[i][S]=f[i−1][S]+f[i−1][S−u−v]。i这一维可以省略,从大到小遍历S,f[S]+=f[S−u−v]。 对于删边操作,注意到加边操作的顺序不影响结果,可以假设第i−1次操作是加入要删除的边。将加边操作的更新倒过来,得到:从小到大遍历S,f[S]−=f[S−u−v]。 时间复杂度O(m2n)。
I. Random Sequence 设f[i][x][y][z]表示考虑前i个位置,ai=x,gcd(ai,ai−1)=y,gcd(ai,ai−1,ai−2)=z的期望,枚举ai+1的值转移即可。 时间复杂度O(nmS),其中S表示(x,y,z)的状态数。显然合法状态中y|x,z|y,当m=100时S=1471。
J. Rectangle Radar Scanner 因为信息不可减,所以不能通过二维数点的方法差分得到答案。 将平面上的点按横坐标进行分治,在两侧递归处理所有没有覆盖中线的矩形询问。对于覆盖当前中线的询问,拆成中线左右两个询问,那么两侧的信息没有重叠,而且矩形4个边界中有一个边界的限制消失了。 问题转化为:求x≤A,B≤y≤C的所有点的信息和。按横坐标将询问和点排序,依次加入每个点或者回答每个询问。用线段树维护纵维度每个区间的信息和。 时间复杂度O((nlogn+m)logn)。
K. Transport Construction 考虑Boruvka算法求最小生成树的过程。对于每个点寻找与它相连的边权最小的边,若边权相同则取另一个端点编号最小的。那么每个连通块要么是树,要么是二元环,最多n2个连通块。将每个连通块缩点,反复迭代O(logn)轮,直至剩下一个点。 问题转化为,给定n个带颜色的点,对于每个点询问和它异色的点中和它点积最小的点。 对颜色进行分治,假设当前考虑[l,r]的所有颜色,递归分治[l,mid]和[mid+1,r],然后用[l,mid]询问[mid+1,r],再用[mid+1,r]询问[l,mid]。 考虑点积的几何意义:向量投影的长度。将一条直线从原点开始往上移动,直到碰到一个点,此时碰到的点一定点积最小。只有下凸壳上的点会被直线碰到,将子区间的凸壳按照横坐标归并,同时将子区间的询问直线按照斜率归并,然后双指针即可。 每轮分治时间复杂度O(nlogn),总时间复杂度O(nlog2n)。
L. Visual Cube 计算画布大小以及各个关键位置的坐标。按照格式将画布填充正确。
M. Walking Plan 设G[i][j]表示i一步到j的最短路,f[t][i][j]表示i经过恰好t条边到达j的最短路,则f[t][i][j]=min(f[t−1][i][k]+G[k][j])。f具有更强的性质,即f[t][i][j]=min(f[x][i][k]+f[t−x][k][j])。将合并的过程看作乘法,则f[t]=f[x]f[t−x]=Gt。 注意到k≤10000,设A=⌊k100⌋,B=kmod100,将每个询问s,t,k拆成两步: 1. 从s出发经过恰好100A条边到达某个点u。 2. 从u出发经过至少B条边到达t。 设a[i]=G100i,b[i]=Gi,那么a[i]即为经过恰好100i条边的最短路,对于b[i]需要再进行一次Floyd得到至少i条边的最短路。 枚举中间点u,则ans=min(a[A][s][u]+b[B][u][t])。 时间复杂度O(n3k−−√+qn)。