Loading

北大营题目总结

回文路径

考虑到一个事情,对于 \(s\) 来说,我去二分回文半径长度,我往右拓展时肯定时 \(s\) 不能拓展的时候才会选择向下从 \(t\) 的对应位置向右拓展,按照这样,我的匹配策略是唯一的,接下来就变成一个模拟题了。

然后分一下奇偶回文串然后看一下回文中心在 \(s\) 还是 \(t\) 还是交界处就好了。比较好的写法是写完关于 \(s\) 直接翻转并交换再跑一次。

分流器

首先注意到 \(b_i\) 没有影响。

假设对于一个结点 \(x\),经过它的操作次数为 \(n\) 次,那么经过 \(out_{x, 0}\)\(out_{x, 1}\) 的次数就都是 \(\frac{n}{2}\),发现如果每个结点的次数都是偶数,那么就走过了一个循环节。

比较好注意到的一个循环节肯定是 \(2^n\),容易证明每个结点次数都是偶数,由于最小循环节肯定是任意一个循环节的因子,我们不妨设最小循环节为 \(2^k\),那么对于任意一个 \(f_i\),都有 \(\frac{f_i}{2^{n - k}}\) 是偶数。注意到就是一个二进制数最低位的 \(1\) 的位置 \(- 1\),我们可以用一个手写压位 bitset 来维护这个东西,复杂度即为 \(O(\frac{n^2}{w})\)

ChiFAN 写神秘特判过去了,有点不太懂,但是场上有人说 \(O(n^2)\) 随便草?

排队

考虑到这么一个事情,对于 \([i, r]\)\([j, r]\) 这两个询问区间的答案,区间长度越长,答案单调不下降。

也就是说,我们考虑扫描线时,假设扫描到 \(r\),那么对于每个 \(i \in [1, r]\),我们记录下 \([i, r]\) 的答案,那么当我更新右端点为 \(r + 1\) 的答案时,我的答案值在 \([l_{r + 1}, r_{r + 1}]\) 内所对应的左端点也应该是连续的,我们将这一段加 \(1\) 即可,不难发现不会破坏原有的性质。

线段树二分求出区间时,我们可以用线段树上二分求出。

Caught in the Middle

首先我们先猜一个结论,令 \(R\) 为左括号,\(L\) 为右括号,那么 Bob 赢当且仅当这个括号序列合法,否则 Alice 赢。

先考虑说明第一个事情。容易发现,无论 Alice 取 \(L\) 还是 \(R\),我们都应该能找到与其匹配的 \(L\)\(R\),这样操作序列又变成了一个合法的括号序列,那么取到最后,一定是 Bob 取完最后一个,Bob 赢。

然后说明第二个事情。比较难发现的是,无论 Bob 如何动,Alice 总能选择一个前缀或者后缀,使得其最优能让其在自己手上变为合法括号序列,交换先后手,不过想要通过构造说明这个点还是比较困难的,应该只能感性理解。

首先我们将整数部分分开算,然后统计每种小数的个数。

发现如果 \(>5\) 我们肯定是四舍五入更优,于是只用考虑 \(< 5\) 的小数点。

相加的话肯定是加的次数越少,然后四舍五入更优,感受一下就知道。于是我们先考虑两个数相加,与 NOIP 2024 T1 类似,由于匹配对的贡献始终为 \(1\),所以你这个时候怎么贪都是对的,注意不要算少了贡献就行,然后接着照样算三个数相加,四个数相加,五个数相加。

Border

发现直接做肯定不太好考虑,因为直接做不弱于 Border 的四种求法了。

但是发现每次都是对 \(S\) 修改一个位置求 Border,可以枚举答案映射回去,这是很好的做法。

于是我们分两种情况讨论:

  1. 修改完后 Border 变短。这一部分是平凡的,至少可以通过倍增 \(nxt\) 数组等方式轻易做到 \(O(n \log n)\)

  2. 修改完后 Border 变长。考虑枚举一个答案,不妨钦定其前后缀必须不同,于是我们找到其中需要修改的字符,两边都修改一次看看行不行即可,然后我们再将可能的答案映射回再取 \(\max\) 即可。需要注意的是,如果 \(s_i = t_i\),那么修改没有效果,答案为 \(S\) 的最长 Border 长度。

需要注意一下常数。

posted @ 2025-01-07 15:52  Alexande  阅读(18)  评论(0)    收藏  举报