模板
1 | namespace manacher{ |
1 | namespace manacher{ |
传送门:http://codeforces.com/contest/1070
solved | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | ! | . | O | O | Ø | O | . | O | . | . | O | . | . |
读错题,自闭,还被人插了?
比较一下两种方法的用时,注意开门用时。
定义每次操作为选取某些已有元素,添加他们的 $mex$ 到集合最后,判断到第几步发生错误。
每次添加的 $mex$ 值不会超过最大值+1,否则都能构造出来,记录一下最大值即可。
$n$ 个人排成一列,给每个人发糖,已知每个人得到的数量,前缀中有 $l_i$ 个大于它,后缀中有 $r_i$ 个大于它。
实际上,可以发现第 $i$ 个人的糖数是第 $l_i+r_i$ 大,通过 $n-(l_i+r_i)$ 构造出每个人的糖数,$O(n^2)$ 判断是否可行即可。
给出 $n$ 个 $k$ 位二进制数,允许将其中一些数取反,求最多区间 $[l,r]$ 的数量,使得区间内异或和不为 $0$。
首先,不考虑修改操作,记录每个前缀异或和 $pre_i$,如果有 $m$ 个位置异或和相同,那么这 $\frac{m(m-1)}{2}$ 个端点两两可以组成一个异或和为 $0$ 的段,时间复杂度 $O(n\log n)$。
对于修改操作,考虑一个贪心的算法,我们要尽量让每个前缀异或和的值出现次数尽量少,根据出现次数比较一下是否翻转,记录出一个 $map$ ,按照上方法进行计算。
注意一个细节,长度为 $0$ 的前缀和为 $0$,因为如果 $pre_i=pre_j$,区间 $(i,j]$ 异或和为 0。
1 | typedef long long ll; |
第 $n$ 位哈希值置 0,从 $n-1$ 开始逆序计算哈希值。
获取子串 $[l,r)$ 的哈希值,注意预处理和取模细节。
注意不要将字符映射到 $0$ 上。
1 | vector<int> edge[maxn], st; |
A*。
1 | namespace kdt{ |
给出 $n$ 个顾客的到达时间和服务他需要的时长,保证没有时间没有重叠,要求在总时间 $L$ 中能休息多少次,每次时长为 $a$。
A题就出了一个大锅,有点没睡醒?忘记在第一个顾客之前的时间也可以休息。
判断给定的矩形图形是否可以用一个剪掉中心的 $3\times3$ 图形可重叠的覆盖。
直接对于每个可以进行覆盖的位置覆盖,最后判断是否覆盖完全即可。
数论乱搞?
给定序列 $1,2,3 \dots n$ ,每次从中间删除一个,并向答案序列中添加原序列中剩余数字的 $\gcd$,要求字典序最大的答案序列。
首先,对于 $n\le3$,样例已经给出。如果 $n>3$,我们注意到由于 $\gcd(i,i+1)=1$,因此一开始会添加很多 $1$,那么要字典序最大显然 $1$ 的个数要最少,所以我们可以保留一个最小的因子,将不包含这个因子的数全部删除,可以发现我们选 $2$ 可以删除最少的数,这时剩下的数字是 $2,4,6 \dots$,且 $\gcd=2$,对于剩下的数字实际上可以除以 $2$,即转化为了原问题。因此,我们可以递归的重复这个过程,直到递归边界 $n\le3$,特判输出即可。
计算几何 + 二分 = 好题。
给定二维平面上的 $n$ 个点,要求一个与x轴相切的最小圆的半径,使得该圆能覆盖所有的点。
显然可以二分半径。
判断条件为是否能够构造出这样一个半径为 $r$ 圆,即是否存在 $a$,使得 $(x_i-a)^2+(y_i-r)^2 \le r^2$ 恒成立。化简得到,不等式对 $a$ 有解满足$\Delta=8ry_i-4y_i^2 \ge 0$ 且 $\max(x_i-\sqrt{2ry_i-y_i^2}) \le \min(x_i+\sqrt{2ry_i-y_i^2})$。
本题还需注意实数上二分的写法。
树上二分好题。
给一棵以 $1$ 为根的有根树,现在要求你将树剖分成一些路径,满足每条路径上的点数小于等于 $L$,权值和小于等于 $S$,且路径上的点以此满足父子关系。
显然,每个叶子都必须分别划分进路径内,考虑一个贪心的做法,对任何一个点尽量在满足限制条件下往上爬,如果不尽量往上肯定不如当前的优。
对于每个点,在从根($L$ 级祖先)到这个节点的路径的前缀和上二分,找到最浅的顶点满足这条路径权值和小于等于 $S$。
计算答案时,因为向上爬的路径是可以重合的,如果一个顶点的所有儿子的剖分路径都不能到达这个顶点,那么这个顶点必须作为一个新的剖分路径。否则,这个顶点在某个儿子的剖分路径内,贪心地取向上爬的最小深度顶点即可。
对于一类区间最值更新问题,我们可以维护最大值,最大值个数和次大值。
对于最小值更新 x: