<span>省选模拟19 题解</span>
A. 鱼死网破(clash)
对于$k=1$的数据,容易发现只要维护每个$x$轴上面的点关于障碍两个端点的极角,并对每个端点对应的极角排序。
对于每个$x$轴下面的点,可以通过极角来二分查找哪些点是看得到的。
感觉和正解的思想差的不多。
正解用到了一步补集转化。
考虑每个$x$轴上面的点,对于每个障碍物的两个端点射出一条射线,求出对应的极角。
合并相邻的障碍物,即可得到一些左端点和右端点(通过一个类似括号匹配的方法即可实现)。
问题是使能覆盖的面积答案为$1$,其他面积的答案为$0$。
考虑将这个极角存在对应的端点上,如果是障碍的左端点,那么对应$+1$,否则对应$-1$。
这样作一个前缀和,即可满足上述的要求。
对于每一个$x$轴下面的点,枚举每个障碍的端点进行二分查找即可。
B. 漏网之鱼(escape)
维护区间$mex$操作。
加入一个元素,对应着指针不断上扫。
删除一个元素,对应着如果已经没有该元素,那么答案对该元素取$min$。
后者更容易维护。
考虑在右端点左移的时候,在线段树上维护每个左端点的$mex$。
容易发现操作对应着$[lst_{a_i}+1,i]$区间对$a_i$取$min$,其他区间不变。
然后直接上势能分析线段树?太麻烦了,而且复杂度不对。
容易发现$mex$函数具有单调性,所以线段树上二分找到第一个大于$a_i$的点,问题转化为区间赋值。
通过这个方法即可解决子任务D。
考虑离线询问,然后问题转化为维护历史的信息和。
所以再打个能维护历史信息和的线段树就好了。
具体来说,可以维护三种下传标记,分别是
$set$,表示区间赋值。
$mul$,表示该区间在历史信息和中已经需要自加$mul$次。
$add$,表示该区间的历史信息和需要加上$add$*区间大小。
为了保证复杂度,认为$mul$的优先级大于$set$的优先级。
当遇到$mul$覆盖$set$的情况,容易发现此时的情况是简单的,所以直接通过$add$标记累计答案。
另外维护三种上传信息,分别为子树最值,子树历史信息和,子树和即可。
C. 浑水摸鱼(waterflow)
子任务5是一个常见的套路部分分,很遗憾又没有想到。
对于数据随机,可以认为答案在长度比较长的时候是没有重合的,可以直接统计。
对于长度较短暴力即可。
正解用到的是后缀数组。
现在的问题是快速比较两个后缀的大小。
如果能解决这个问题,通过后缀数组求本质不同子串的方法,问题迎刃而解。
可以通过哈希二分判等,找出两个后缀相等的最长长度,然后判断下一个位置即可。
对于字符集比较小的情况,将哈希的式子展开,容易发现一个特别的做法:
首先认为每个字符的最终编号都为$1$,独立统计每个字符的$hash$值,即$\sum \limits_{i=1}^n[a_i==k]p^i$。
对于每个后缀,找到字符集的排名。之后乘上对应的系数即可找到哈希值。
对于字符集并不小,考虑抛弃题中给出的最小表示法,用另一种方法表示状态:
对每个位置,维护现在出现位置与上次出现的位置的差。
那么哈希值为$\sum \limits_{i=1}^n(i-lst_{a_i})*p^i$,容易发现哈希值与状态是一一对应的。
这个哈希值可以直接通过主席树维护了,所以问题得到解决。