模拟63 题解
A. Median
线性筛完质数,就会发现给的时间已经快没了。
所以只能$O(n)$求$n-k$个中位数?
不会做,所以打权值线段树。
在权值线段树上二分找第k大值,可以做到$O(nlogn)$。
打$zkw$线段树,比传统线段树快一倍,然而并没有什么用,仍然T70。
题中确实给出了一些特殊性质:
模数小于区间长度小于$n$。
看似奇怪,却很有道理。
在本题几乎随机的数据下,每次中位数的变化量一定是不大的。
用一个桶维护当前区间每个权值的个数。
所以用一个指针不断继承左侧权值的个数,
不断尝试移动找中位数就可以了。
B. Game
本来以为是一道博弈论题。
突然发现有点奇怪,先手每个不同的策略转向相同的结果,即右区间加一,后手继续选。
所以最优策略一定是各自选最大的数。
堆优化可以做到$O(nmlogn)$。
然后就是一个显然正确但想不到的优化。
因为本题中保证权值不超过$n$,所以可以先将给定的权值放进桶中。
一个单调指针从大往小扫,对于桶中每一个元素:
删去这个元素,
如果新加入的元素大于当前指针,那么不断继续删除新加入的元素。
否则直接入桶。
C. Park
观察特殊测试点,可以发现。
暴力枚举起点,$O(n^2v)$的$dp$可以得到70分。
设$f[x][i]$表示从枚举的起点到$x$,总共用了$i$个屑面包屑。
设$s_x$表示与$x$相连的点的权值和,$w_x$表示点$x$的权值。
那么有$f[x][i]=max(f[from][i],f[from][i-1]+s_x-w_{from})$
考虑优化这个枚举起点的$dp$,
对于任意一个有序点对$(a,b)$,即对应$a \rightarrow b$的方案,可以在它们的$lca$处合并两个状态,即$dp_{a \rightarrow lca}+dp_{lca \rightarrow b}$。
然而并不是所有的点对都有用。
对于同一个$lca$的同一个权值$i$,只关注最优的上来的路径,即$f[lca][i][0]$,
和最优的下去的路径,即$f[lca][i][1]$,在$lca$处尝试合并这两条路径就可以了。
仿照上一个暴力算法的$dp$,转移是简单的。
需要注意的是,有一些打法只能合并原有的上来路径和当前的下去路径来更新答案,所以$dp$需要再倒着做一遍。