省选模拟19 题解

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$,容易发现哈希值与状态是一一对应的。

这个哈希值可以直接通过主席树维护了,所以问题得到解决。

posted @ 2020-02-06 21:29  skyh  阅读(173)  评论(0编辑  收藏  举报