罪的晚风,可曾带回朝露映的清纯?|

LarsWerner

园龄:4年11个月粉丝:20关注:3

JOISC 2022 题解

JOISC2022 Day1 监狱 Jail

首先我们发现操作一定是给所有人排序,然后按照顺序直接从 si 挪到 ti,要求是对于 i,所有在它之前挪的 t 不能在 siti 上,所有在它之后挪的 s 不能在 siti 上。有了这个条件我们就可以 O(n2) 建图。但是这样太慢了,考虑优化建图。对于路径 iuv,设 u 下一个点 uv 前一个点 v,那么建立点 S1,,SnT1,,Tn,那么连边 TuiiSuS[u,v]iiT[u,v],这个建边可以用树剖线段树优化建图。然后再跑一遍拓扑即可。

https://qoj.ac/submission/105989

JOISC2022 Day1 错误拼写 Misspelling

首先我们转化一下条件。对于条件 (i,j),如果 i>j 那么就代表 [j,i] 区间内的字符串要么全相等,要么第一段连续段的字符比第二段连续段的要小,称其为第一类限制;如果 i<j 则代表要么全相等,要么第一段连续段的字符比第二段连续段的字符要大,称其为第二类限制。所以我们考虑对连续段进行 DP。对于连续段 [l,r],如果存在第一类限制的区间 [L,R] 满足 lLi<R,那么后面接着的连续段的字符一定大于这个连续段。第二类限制同理。f(i,c,0/1/2) 表示考虑 [1,i],连续段结尾为 i,连续段字符为 c,且 i+1 开始的连续段的字符没有限制 / >c / <c。然后再令 g(i,c) 表示考虑考虑 [1,i]i+1 开始的字符为 c 的方案数。 f 相当于 g 的一个区间和,g 也可以由 f 求得。复杂度 O(26n+nlogn)

https://qoj.ac/submission/106082

JOISC2022 Day2 复制粘贴 3 Copy and Paste 3

对于串 S,如果它的出现位置和一个长度大于它的串 T 相同,且不存在两个连在一起的 S,那么它就一定没用。于是需要的串的数量一共就 O(n),暴力建后缀树然后看是否存在两个连在一起的出现次数即可。然后对于两个关键串 i,j,我们令 ci,j 表示串 j 在串 i 中的不重叠的出现次数。令 li 表示 i 的长度,那么求一次 ci,jO(lilj) 复杂度的,于是总共复杂度 O(n2logn)。然后就可以 O(n2) 地进行 DP 了,每次枚举上一次 copy 的串即可。

https://qoj.ac/submission/106110

* JOISC2022 Day1 京都观光 Sightseeing in Kyoto

首先需要发现一件事情:有用的 ai 一定在下凸壳上,bi 同理。凸性的证明可以考虑调整法:对于 ai,j,kbx,y,要从 (i,x)(k,y),发现 (i,x)(j,x)(j,y)(k,y) 会更优当且仅当 ai,aj,ak 是凸的。

然后我们相当于就是要把两个凸壳并起来,然后最优化一些东西。容易联想到凸壳的闵可夫斯基和。于是我们就按照斜率把它们给归并起来,归并的同时计算答案。

https://qoj.ac/submission/106204

JOISC2022 Day2 团队竞技 Team Contest

考虑直接贪心。我们维护三个堆,堆中分别按 x,y,z 排序,每次取堆顶。如果存在一个堆顶的元素不符合要求,那么我们发现这个无论怎样都不可能合法了,直接删掉即可。实际操作用 sort 后的数组维护即可。

https://qoj.ac/submission/106292

* JOISC2022 Day3 洒水器 Sprinkler

先是搞了一个 O(Qdlogn) 的不能通过的做法…然后发现可以分块+猫树变成 O(Qn+Qd)…但是这代码得有 4kb…

实际上有更为简单的办法。考虑维护一些 tag,gu,d 表示 u 子树中距离 ud 的点的 tag。考虑如下的修改方式:对于 uh 阶祖先 x,在 gu,dhgu,dh1 处打 tag。这样所有点都会被覆盖到。

https://qoj.ac/submission/106339

* JOISC2022 Day3 蚂蚁与方糖 Ants and Sugar

考虑将二分图最小匹配转化为最大独立集。用 X 表示蟻,O 表示糖,即选择尽量多的点,使得对于任意 X 与 O 之间的距离 >L。我们考虑 O 形成的一些区间。对于位于区间 [x,y] 的一些 O,需要保证 [xL,y+L] 中没有 X。若令 S 表示 O 的前缀和,T 表示 X 的前缀和,那么我们先假定先选所有 X,那么区间 (l,r] 的 O 的贡献就是 SrSlTr+L+TlL

xi=Si+TiLyi=SiTi+L,我们相当于就是需要交错地选择一些 x,y,最大化 x+y。有了这个就可以维护矩阵了,f0/1,0/1 表示区间中第一个选择的是 x/y,最后一个选择的是 x/y,是可合并的。但是注意到我们每次是一个后缀的修改,不是很好做。但是我们再仔细看一看修改的形式。若插入一个 O,那么就是后缀 xiayi+a,这对一个状态的贡献只和 x/y 数量差有关,而数量差只会是 0/1 这个信息已经维护出来了,所以可以直接打 tag 修改。若插入一个 X,那么可以拆分成一个后缀 xi+ayia 和一个区间 yia。注意到这个区间是 [xL,x+L1],长度 2L,所以只会有不超过 2y(即最多只有一个整区间),所以可以再对于 2L 的区间的状态记录 y 数量即可。

这个做法比较卡常,把转移手动循环展开了。然后把全 0 的给特判掉了。

https://qoj.ac/submission/106588

JOISC2022 Day4 一流团子师傅 Super Dango Maker

发现询问次数只有 nmlogm。考虑动态维护每个串 Si,每次我们将目前的串加入编号最小的,可以加入的串,这样的话就保证了串的单调性,即 Si+1Si,于是每次就可以二分。这个条件即对于所有 j<iaiSj。也就是集合 SiSm{ai+1,,an} 中,距离 mi+1 个串恰好少一个 ai。所以我们每次在二分时问这样的集合即可。

https://qoj.ac/submission/107628

* JOISC2022 Day4 鱼 2 Fish 2

考虑对于一段区间 [L,R],第 i 只鱼能吃到的鱼为 [li,ri]。若 [li,ri] 不是 [L,R] 的前或后缀的话,那么这条鱼就永远不可能对包含 [L,R] 的区间产生贡献。而对于可以吃到一段前缀的鱼,它吃到的前缀只可能有 O(logV) 个,即满足 j=Liai<ai+1 的那些 i,后缀同理。而合并两个区间的时候,一个可能产生贡献的鱼吃到的区间的左端点也一定是左半部分的后缀端点,右端点一定是右半部分的前缀端点。于是我们区间只需要维护每个有以上特征的前后缀,以及有多少鱼恰好吃到这个前后缀,就能完成信息的合并,求出答案。合并可以暴力扫,复杂度 O(logV),于是总复杂度 O(nlognlogV)

https://qoj.ac/submission/107974

* JOISC2022 Day4 复兴计划 Reconstruction Project

首先注意到每条边的贡献时间一定是一段区间 [l,r],又由于点数很少,所以可以暴力维护边的删和加。但是看上去很难直接维护得知哪些边要加哪些边要删,所以我们考虑不对时间扫,而对边扫。先建出最小生成树后,从小到大扫边,每次看这条边 i 形成的环上的最小边 j,并把它给替换了,并记录更改时间 rj=li=wi+wj2。复杂度 O(nm+(m+q)logm)

https://qoj.ac/submission/107902

本文作者:LarsWerner

本文链接:https://www.cnblogs.com/TetrisCandy/p/17422304.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   LarsWerner  阅读(620)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起