摘要:
前言 如题。 值域分块 顾名思义,就是在桶上分块。 它的用处是把区间修改和区间询问中某一种操作变成 \(O(1)\),另一种变成 \(O(\sqrt n)\)。 所以经常用来辅助维护两种操作数量严重不对等的数据结构。 典型代表有莫队和根号分治。 这里看一个莫队的例子。 如我们要维护一个二维数点。 那 阅读全文
摘要:
Part 1 求证:\(\frac{n}{\sum_{i=1}^{n}\frac{1}{y_i}} \leq ({\prod_{i=1}^{n}y_i})^{\frac{1}{n}}\) \(y_i\) 为正实数 \(n \geq 3\) 证明: 令 \(x_i\) = \(y_i^{\frac{1 阅读全文
摘要:
调了一小时结果发现爆 long long 了。 考虑数位 dp,具体来说,设计状态 \(dp_{i,r_1,r_2,r_3,mx_1,mx_2,mx3_,c_1,c_2,c_3}\) 表示当前考虑到第 \(i\) 位,\(x_1,x_2,x_3\) 模 \(a_1,a_2,a_3\) 等于 \(r_ 阅读全文
摘要:
考虑一颗树怎么染色。 每个子节点染成边的颜色,如果与父亲节点相同,就随便染色(这条边的限制已经被父亲节点满足)。 那么一定可以染色。 所以把原图跑最小生成树再按上述方法染色即可。 倘若原图不连通,那么无解。 阅读全文
摘要:
后向差分 对于函数 \(f(x)\) 定义等距节点 \(x_k = x_0 + k \Delta x\)。 有: \[\Delta f(x_k) = f(x_{k}) - f(x_{k-1}) \]下文简称差分。 高阶差分 一般来说,\(k\) 阶差分的定义如下: \[\Delta^k a_n = 阅读全文
摘要:
先考虑这个式子: \[\sum_{j=1}^{M} |C_{k_{j}} - C_{k_{j+1}}| \]一定是在 \(C\) 有序时取到,具体证明很简单各位读者自己证明。 那么现在式子变成: \[\sum{V} + 2 \times({C_{\max} - C_{\min}}) \]这个时候一个 阅读全文
摘要:
首先这个查询操作很迷,考虑先化简查询操作。 不难发现由于每次是加上一个逆的等差序列,因此一次操作完每个数与它的前驱之差一定会减少,因此加上等差序列的次数就等于全局每个数与它的前驱之差最大值。 又因为会排序去重,所以最后剩下来的数一定是最开始的数一路加过来的,至此我们发现答案就是全局每个数与它的前驱之 阅读全文
摘要:
做这个东西有两个用处,一是初赛会考,二是考场上用 windows 哪里数组越界你都不知道直接 RE 爆炸。 sudo -s 输入后填写密码获得管理员权限。 cd 打开文件或者目录,用法是 cd 目录名。 cd / 退回到根目录。 mkdir 创建一个目录,使用方法为 mkdir 目录名。 ls 显示 阅读全文
摘要:
其实我们发现很多博弈论的动态规划都是从后往前的,比如过河卒和本题。 这是因为从某种角度上来说这些动态规划有后效性而无前效性。 所以设计状态 \(dp_{i,j}\) 表示第 \(i\) 次操作 \(T\) 模 \(7\) 的余数为 \(j\) 的情况下能否走到 Takahashi 的胜利状态。 然后 阅读全文
摘要:
发现一个神奇的事实:显然不限制交换次数可以实现交换任意字符。 因此可以直接判断字符集是否相等。 在考虑哪些地方可以交换。 根据题意可知可以交换的区间为 \([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 序排序,相邻两点(包括第一个会最后一个点)在树上的距离之和便是其路径并大小的两倍。原理的话便是路径 阅读全文