省选模拟19

A. 鱼死网破(clash)

  对于x>0的每条鱼,计算出与每个墙的两端连线的斜率,对于重合的墙,可以将他们合并成一堵墙。

  对于x<0的鱼,考虑枚举每堵墙,那么这面墙的贡献分为左右,显然这面墙有贡献当且仅当在两个端点中央,考虑对于经过这面墙左端点的射线权值为1,右端点权值-1,那么一个点的答案就是所有在它左边的射线的权值和。直接二分找到对应位置即可。

B. 漏网之鱼(escape)

  考场上想到了非常麻烦的一种解法,调到最后也没有调出来,非常自闭。

  考虑特殊性质D该怎么做,枚举左端点,维护出每个右端点的贡献。当左端点移动1时,显然答案需要修改的区间是连续的,并且可以转化成区间赋值,全局和,直接维护就行了。

  考虑把这个东西推广到正解,发现这个东西大约可以用两个比较简单的区间答案相减得到。那么我们需要维护出来对于每个右端点所有左端点答案之和,同样移动左端点,那么需要维护历史和,这个东西可以直接打标记来实现,非常恶心,大约就是固定标记下传的顺序,然后将一个标记转化到另一个上面。细节很多。

  所以考场上没有调出来,爆零了。

C. 浑水摸鱼(waterflow)

  这种奇怪的字符串问题可以考虑一下后缀排序。那么如果有了排好序的后缀数组就可以直接得到本质不同字串个数。

  考虑采用二分+hash来得到答案,考虑如何快速得到一个区间的hash值,首先对于字符集较小的情况,可以考虑暴力处理出每种字符在全局的hash,那么乘上对应的系数就可以得到区间的hash值。

  在字符集较大的时候就不行了,所以可以考虑修改hash的定义,定义一个位置的权值为每个字符与他后面第一个与他相同的位置的位置之差,显然这个东西也可以判等。

  然后可以发现这个东西可以用主席树来维护得到任意一个区间的hash值,所以问题得到解决。

  注意这个比较函数的复杂度很高,由于sort的内部实现比较鬼畜,所以用稳定的归并排序较好。

原文地址:https://www.cnblogs.com/hzoi-cbx/p/12271013.html