Noip 模拟 3 2018/10/19

T1:circle
小 w 的男朋友送给小 w 一n 个m 条边的图,并且刁难小 w 要她找出点数最少的正环
小 w 不会做,于是向你求助。

好像暴力 92 92 92%,打挂了 32 32 32%
CF147B smile house
考虑dp
f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示从 j j j k k k走了 2 i 2^i 2i步的最大价值
类似于Floyd 最小环算法,枚举中间走过的点取最大值
二分最小步数,判断是否成立
时间效率 O ( n 3 log ⁡ n 2 ) O(n^3 \log n^2) O(n3logn2)
卡常
利用倍增的思想,跳到第 2 i 2^i 2i时满足时再往下找最大的 j j j使得 2 i − 2 j 2^i-2^j 2i2j成立
时间效率 O ( n 3 log ⁡ n ) O(n^3 \log n) O(n3logn)
还是卡常好

T2:max
*小 h 的男朋友送给小 h 一个长度为 的序列,并且刁难小 h 要她找出其中 m 个区间的最大值。
小 h 不会做,于是向你求助。 *
输入是生成函数,本以为会有规律,没找到
数据结构裸题,大力线段树就好
普通线段树会被卡常, 70 70 70% − 100 -100 100%
正解zkw线段树,常数优秀
可写树状数组,还有一种玄学写法(by lhy)看不懂

T3:seq
*小y 的男朋友送给小y 一个数列 a i {a_i} ai,并且刁难小y 要她维护这个序列。
具体而言,小y 的男朋友要求小y 完成两个操作:

  1. 修改数列中的一个数
  2. p i p_i pi表示 m a x j = 1 i a j max_{j=1}^ia_j maxj=1iaj,求出 ∑ i = 1 n p i \sum_{i=1}^{n}p_i i=1npi
    小y 不会做,于是向你求助。*

考场只会增大操作,减小不会写, n 2 n^2 n2大力 25 25 25%
正解不会写
神仙线段树浪费我两个下午的时间
orz slz lhy Jyc pjd lkw xjq szm
我们考虑若修改了 i i i 点,显然只会对在它后面的点有影响。
现在我们在线段树上考虑这个问题。设 n o d e node node 是线段树上代表 [ l ; r ] [l; r] [l;r] 区间的点, l s ; r s ls; rs ls;rs 分别是
n o d e node node 的左右儿子, v v v 是数列位置在 l l l 之前一个被修改的值。
那么:

  1. v v v 大于 m a x . l s max.ls max.ls ,显然 [ l ; m i d ] [l; mid] [l;mid] 区间内的点的 p i pi pi 都会被修改为 v v v(注意这里的 p i pi pi 并不是正确值,必须要递归回到树顶才是真正的 p i pi pi),于是我们只需要递归 r s rs rs
  2. v v v 小于 m a x . r s max.rs max.rs ,则 [ m i d + 1 ; r ] [mid + 1; r] [mid+1;r] p p p 不会被更新,于是我们只需要递归 l s ls ls
    这样,线段树上每合并两个节点,都需要用左儿子更新一次右儿子。
    复杂度 O ( n l o g 2 n ) O(n log2 n) O(nlog2n)

    代码详见
    https://blog.csdn.net/Johnny817/article/details/83215191

你可能感兴趣的:(2018NOIP)