一些題
Xor-MST
异或出现在题目中有两种可能:\(\mathtt{0/1trie}\) 或线性基。当然这道题线性基是不可能了、也没学过。
先按照异或的套路,将 \(\{a_i\}\) 放入 \(\mathtt{trie}\) 中。
Kruskal:每条边按照边权从小到大依次加入生成森林中,若两端点不联通则加入这条边,否则跳过。
显然在 \(\mathtt{trie}\) 树上最多有 \(n\) 个叶子节点,每个叶子节点代表相同的一坨 \(a_i\)。\(\mathtt{trie}\) 中有这样的性质:考虑代表 \(a_i,a_j\) 这两个叶子节点在 \(\mathtt{trie}\) 树上的最近公共祖祖 \(lca_1\),从这个 \(lca_1\) 之后,\(a_i,a_j\) 才分道扬镳。
若存在两个叶子节点 \(a_u, a_v\) 的最近公共祖祖 \(lca_2\) 为 \(lca_1\) 的祖先,一定有
因此,如果以点 \(p\) 为 \(lca\) 的代表叶子节点若想在 Kruskal 流程中连边,必须有点 \(p\) 的左子树和右子树的叶子节点已经分别形成联通块了;这启发我们 \(\mathtt{trie}\) 树上的合并是有先后顺序的。
- 从下往上合并,对于每一个有两个儿子的节点 \(p\),从左子树中找出 \(a_x\),右子树中找到 \(a_y\),使 \(a_x \oplus a_y\) 是能找到的最小值,加入答案。
 
Dirty Arkady's Kitchen
考虑 \(\forall 1\le i \le n:l_i=0\) 的情况,这种情况下只有 \(t < r_i\) 的限制,直接跑最短路,走不过去就别走了!
然而 \(l_i \ge 0\)。这意味着有的时候不能走,但耽搁一会儿时间就能走了。怎么耽搁时间?一个朴素的方法就是在一条边上反复横跳。从 \(u \to v\) 再 \(v \to u\) 的时间显然是 \(2\),与 \(2\) 有关则说明与奇偶性有关。把每个点 \(p\) 拆成奇时间到达 \(p_1\) 和偶时间到达 \(p_0\),一条无向边拆成 \(2\) 条有向边,每条有向边 \((u,v)\) 再拆成 \(u_0 \to v_1\),\(u_1 \to v_0\)。
考虑一个类 dijkstra 算法:节点中存入 \((p,l,r)\) 三个信息,每次弹出 \(l\) 最小的点为 \(p\),到达时间可取 \([l,r]\),那么对于从 \(u\) 出发的每个满足 \(l_i \le r\) 的边的终点 \(v\) 到达时间可取 \([\max\{l+1,l_i+1\},r_i]\)。注意边的更新顺序必须按照 \(l_i\) 从小到大更新。
市场
序列上的问题考虑线段树。注意下面的下标从 \(1\) 开始,不是题目中所给出的从 \(0\) 开始。
不难想到一段区间的数全部相等时,整除结果相等。遇到这种情况我们进行区间赋值,否则暴力到叶子。考虑怎么让它跑到 \(O(n^2)\)。考虑让 \(a_1=2^k-1,a_2=2^k,a_3=2^k-1,\dots,a_n=2^k-[a\bmod2]\)。然后执行若干次 \(d=2\) 的 \(2\) 操作,每次都会跑 \(\mathcal O(n)\),再及时用区间加法补充,这辈子都跑不快了。
观察到其实上面构造的数据等价于区间减 \(2^{k-1}\)。来推一下区间整除可以用区间加法替代的充要条件:
假设区间最大值为 \(a\),最小值为 \(b\)。让 \(a=pd+r,b=qd+t(0\le r,t < d)\)。则执行区间整除操作后 \(a \gets p,b\gets q\)。可以证明,\(p-a=q-b\) 是区间整除可以用区间加法替代的充要条件。
可以用势能分析证明时间复杂度为 \(\mathcal{O}(n\log^2n)\),\(n,q\) 同阶。
代码里的区间赋值纯纯因为大白兔吃多了,可以不看。

                
            
        
浙公网安备 33010602011771号