口胡赛 2025.2.8

T1

先枚举 \(k\),然后你关心的是 \([A_{i,j}=B_{i,j}]\) 还有 \([A_{i,j}=B_{i,j-k}]\),你选择移动的矩阵第二个要全 \(1\),更美观的就是 \([A_{i,j}\neq B_{i,j-k}]\) 要全 \(0\),这种极大矩阵只有 \(O(n^2)\) 个,枚举两个边界单调栈可以轻易求出,再来点二位前缀和就行了,总的复杂度 \(O(n^3)\)


T2

比较经典的排序之后相邻的才有贡献,套上莫队容易直接做到 \(O(n\sqrt n\log n)\),当然可以做到更均衡的复杂度,但是貌似难以优化到 \(O(n\sqrt n)\)

这个区间 \(\min\{\oplus\}\) 不可减看上去难以直接做,但是观察到无用的点对比较多,我们可以考虑一下什么点对有用。对于 \(i<x<j\)\((i,j)\) 有用那显然是 \(\min\{a_i\oplus a_x,a_x\oplus a_j\}>a_i\oplus a_j\),对于一位来说,如果 \((a_i)\neq (a_j)\) 那么 \((a_x)\) 一定能匹配出更小的 \(0\),如果 \((a_i)=(a_j)\),若 \((a_x)=(a_{i/j})\) 那么持平,\((a_x)\neq (a_{i/j})\) 的话 \(x\) 就只能去祝 99 了。综合上述,一个可以打破合法的 \(x\) 要满足,在 \(a_i/a_j\) 的位不相同前跟它们保持一样,也就是 \(lcp(a_i,a_j)=lcp(a_{i/j},a_x)\),可以得到 \((i,j)\) 合法其实就是不存在 \(k\in (i,j)\) 满足这个。

然后现在要对一个合法的 \(r\) 考虑一个 \(l\),该从枚举 \(lcp\) 下手,比较明显 \((r,lcp)\) 只对着一个 \(l\),比如说 \(i\) 前面有 \(j_0<j_1\) 满足 \(lcp(i,j_{0/1})=k,lcp(j_0,j_1)>k\),那么 \(j_0\) 被淘汰其实要的是最后一个,因为 \((j_0,j_1),(j_1,i)\) 一定有一对更小的捏。根据这个分析点对数量只有 \(O(n\log V)\) 这么多了,然后求点对的方法可以 trie 也可以来点点 stl 都很好做的啦。

然后你现在有好多的 \((l,r,ans)\) 要贡献给询问 \([L,R]\)\(L<=l,r<=R\) 是一个平凡的二维数点想怎么做怎么做,这里多一个 \(\log\),总的复杂度 \(O(n\log V \log (n\log V))\)


T3

暴力怎么做?能邀请的邀请。相当于一个拓扑排序,比较显然。形式化的说,每次取出一个 \(sum(l_i,r_i)\geq k\)\(i\) 使其为 \(1\)

那你 \((l_i,r_i)\) 做的途中肯定不能遍历,那肯定要分块,分块怎么处理限制,有一个经典技巧,将集合 \(S(k)\) 分成 \(L(\lceil\frac{k}{2}\rceil),R(\lceil\frac{k}{2}\rceil)\),当其中一个满足限制之后拿出来重新分配剩余限制,这样子 \(k\) 每次至少下降一半,复杂度只要乘一个 \(\log\) 就能划分集合了。现在考虑怎么分成两半,考虑猫树分治,那么就要在猫树上面维护前后缀了,剩下都是好做的,把 \((i,l_i,r_i)\) 挂成第一个跨越的区间的子区间的前后缀,每次单点加 \(1\) 一个 \(i\) 就从下往上遍历影响到的区间,对每个区间的贡献是前后缀的形式,容易用数据结构维护,然后对于超过限制的点拿出它的另一半重新放限制,如果彻底满足限制就累计答案放入要修改的序列。


T4

两个路径不交我们可以枚举断边,然后在连通块中分别考虑答案。首先 \(len_x\) 表示根到 \(x\) 的边权异或和,那么 \(val(x,y)\) 就是 \(len_x\oplus len_y\),子树里面的启发式合并就行了。子树外的可以考虑提前求出全局最长的 \((p,q)\),令 \(p\) 为根,除了路径上的点别子树外都是这个 \(val(p,q)\),路径上的再单独扫描一遍是容易的。其实先做完子树里面然后在直接按某种方式合并也可以求出答案(

posted @ 2025-02-08 19:56  Hypoxia571  阅读(31)  评论(0)    收藏  举报