JOI Open 2023

发布时间 2023-08-27 16:12:21作者: yllcm

T2 怎么 std 9k。

*loj3985. 「JOI Open 2023」古代机器 2

tag:交互,字符串,线性代数。

感觉很厉害。

解法一:\(m=n+2\)

考虑按位确定,那么确定第 \(i\) 位的时候建立如下自动机:对于 \(j<i\)\(a_j=b_j=j+1\)\(a_i=i+1,b_i=i+2\),然后在 \(i+1,i+2\) 连两个自环。

解法二:\(m=n+1\)

仍然是按位确定,只不过是从后往前。考虑如何判断一个后缀是否为给定字符串 \(T\),做法是建立 \(T\) 的 KMP 自动机然后在上面跑,最后判断匹配长度是不是 \(|T|\) 即可。回到原问题,每次在 \(T\) 开头尝试添加一个字符并询问即可。

解法三:\(m=114\)

重量级。

发现可以询问出所有数的和:造两个点,然后互相连。

想到这个可以得到一个扩展:询问出 \(i\bmod p=q\) 的所有 \(s_i\) 的和。这样可以得到一个线性方程组,消元即可。

考虑怎么做,可以建立 \(2p\) 个点,前 \(p\) 个点连一个环,后 \(p\) 个点连一个环,然后考虑把 \(b_q\)\(b_{p+q}\) 交换一下。最后只要判断点在哪个环上面。

对于 \(p\leq 57\) 的所有 \(p\) 询问可以得到 \(n\) 个线性无关的方程组。

正解:

考虑把三个做法拼起来。对于前 \(100\) 个点用做法一,后 \(100\) 个点用做法二,然后对 \(p\leq 51\) 的所有 \(p\) 做可以得到足够的线性无关方程组,最后消元即可。注意使用 bitset 优化。

*loj#3987. 「JOI Open 2023」花园

tag:最大矩形问题,扫描线。

以下在 \([0,2d)\times[0,2d)\) 范围讨论。

只会一个巨大斜率优化做法,大概就是枚举下边界,然后枚举左边界,这样高就是不被包含的第二类点的最大值,但是注意到第二类点有两列,所以这个最大值实际上是一个区间最大值,然后写个单调栈,然后把单调栈上的点加进凸包里面。

这个我不知道对不对啊,谁爱写谁写去!

正解是枚举左边界然后递推地计算右边界。乍一看不太好做,因为直接在纵坐标上做的话需要写双指针,如果还要动态加入一些限制基本上做不得。但是问题实际上有更好的刻画:注意到 \([d,2d)\)\([0,d)\) 复制而来的,所以可以把这个东西看成一个环。那么环上包含所有点只需要求出两两之间最大的空隙即可,然后就可以用链表维护了!

完全没意识到是环,火大。