HNOI2018 题解

Day1

寻宝游戏

对于 qi q i 每一位分别考虑,如果为 1 1 ,首先一定存在 |1 | 1 操作,而且在最后一个 |1 | 1 操作后全为 &1 & 1 |0 | 0 操作。

我们发现把运算符写为二进制数(右边为高位, | | 为0, & & 为1),最后结果为1的充要条件是存在某个最高位原来为 1 1 填入运算符为0,且更高位相等,也就是字典序小于原来串的字典序。 我们先对原串排序,之后取为1的最小,为0的最大相减即可。

Code

转盘

最优的操作可以是先在某一位置等到某个时间然后走一圈回来。 我们考虑维护这个等待时间的最优值。
为了方便先把环改为链,且令 Ti+n=Ti T i + n = T i
一个位置出发时间 ti t i 需要满足 ti+(ji)Tj t i + ( j − i ) ≥ T j m,即 tii=maxji{Tjj} t i − i = max j ≥ i { T j − j }
答案为 min{ti}+n1 min { t i } + n − 1 考虑线段树如何维护。

我们发现一个区间的左边对右边无影响,右边对左边只有 max{Tjj} max { T j − j } 有影响。且 tii t i − i 单调不增。 首先判断左儿子的左儿子的 tii t i − i 是否小于右边的 max{Tjj} max { T j − j } ,如果是那么左儿子的右儿子的 ti t i 会直接变成右边的值,最优的是 mid+1 m i d + 1 的位置,左边递归下去。 否则对于右边无影响我们取已经处理出来的最优值,左边递归下去即可。

时间复杂度 O(nlog2n) O ( n log 2 ⁡ n )

Code

毒瘤

首先我们dfs一颗树出来,然后枚举强制不满足哪些非树边来容斥,不过这样是 O(2mn+1n) O ( 2 m − n + 1 n ) 的,可能有点卡。

发现计算有很多类似之处,唯一不同的就是有非树边的地方。我们把这些地方拿出来建虚树,利用动态DP思想先把某个儿子到父亲的转移矩阵预处理出来,然后 O(mn+1) O ( m − n + 1 ) DP即可。

时间复杂度 O(2mn+1(mn+1)) O ( 2 m − n + 1 ( m − n + 1 ) )
Code

Day2

游戏

直接 O(n2) O ( n 2 ) 往左右扩展就能过了。

可以 O(n) O ( n ) ,按照拓扑序记忆化拓展即可。

Code

排列

按照描述建图,发现是一个树形图(否则无解),父亲要比儿子排在前面。
显然权值最小的点在父亲选之后马上会被选。我们把他合并到父亲节点,然后就变成了二元组 (ti,si) ( t i , s i ) , ti t i 表示和, si s i 表示个数, i i j j 先选的条件是 tisj<tjsitisitjsj t i s j < t j s i ⇒ t i s i ≤ t j s j ,用优先队列维护即可。

Code

道路

网上都是DP,我比较智障写了网络流。。

拆开式子: ans=iaibici+aiciy+bicix+cixy a n s = ∑ i a i b i c i + a i c i y + b i c i x + c i x y

第一项直接统计,第二三项放到边上处理,最后一项相当于是一对边会贡献 ci c i ,最小割即可。

Code

你可能感兴趣的:(HNOI2018 题解)