摘要:
发现一个神奇的事实:显然不限制交换次数可以实现交换任意字符。 因此可以直接判断字符集是否相等。 在考虑哪些地方可以交换。 根据题意可知可以交换的区间为 \([1,n - k]\) 以及 \([k + 1,n]\)。 不能交换的区间是静态的,所以判断是否相等即可。 代码实现很简单,就不给出了。 阅读全文
摘要:
写了一小时结果被卡常了(笑。 考虑新加入一个数什么时候会产生贡献,或者什么时候不会产生贡献。 发现当一个数的位置与他前一次出现时的位置所构成的区间内假若有一个比它小的数那么就不得不对这个数新进行一次操作而不能共用。 又因为询问一个值域范围内的贡献,所以考虑把这个范围内最大的小于这个数本身的数找出来就 阅读全文
摘要:
既然是求最大值而且有收益有代价,所以考虑建立一个最大权封闭子图模型。 收益 正的美味值是收益,所以假若 \(d_{i,j} \geq 0\) 则建边 \((s,pos_{i,j},d_{i,j})\)。 代价 负的美味值是代价,所以假若 \(d_{i,j} < 0\) 则建边 \((pos_{i,j 阅读全文
摘要:
其实很简单,把之前随机数据的解法中维护块内数据的数据结构换成约束 RMQ,这样子复杂度 严格 单点修改 \(O(\sqrt n)\),区间查询 \(O(1)\),线性空间。 唯一的问题是常数太大了,有 \(4\) 倍常数。 #include <bits/stdc++.h> using namespa 阅读全文
摘要:
\(x = 2^k\) 是好做的,每次以 \(2^{k-1}\) 为因数即可。 对于其他情况,考虑每次让 \(x\) 减去其二进制下最低位的 \(1\) 直至变成 \(2^k\)。 这种策略下显然每个数只会在以上两个大步骤下取到,故每个数使用不超过 \(2\) 次。 同时操作次数在 \(O(\log 阅读全文
摘要:
考虑把每个字符串的前 \(k\) 位和后 \(k\) 位看成点,字符串看成边,那么一个字符串前缀后缀至少有一个是相似群体的前缀后缀,看成这条边的两个端点至少有一个被选中。 那么这就变成了一个最小点覆盖问题。 考虑匈牙利算法算出答案,然后考虑如何构造答案。 考虑右边没有被匹配的点,选中这些点向左边连的 阅读全文
摘要:
考虑把贡献摊到每个点上计算,每个点带来的贡献实际上是经过它的路径并大小,算完求和之后在除以 \(2\) 就得到了答案。 考虑怎么计算路径并大小。 考虑这样一个办法,将所有路径的起始点和终点按照 DFS 序排序,相邻两点(包括第一个会最后一个点)在树上的距离之和便是其路径并大小的两倍。原理的话便是路径 阅读全文