模拟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$需要再倒着做一遍。

posted @ 2019-10-07 16:39  skyh  阅读(205)  评论(7编辑  收藏  举报