开坑 主要是cf和atcoder 记录一下非水题
博弈论,两人轮流在树上跑,每次分别可以移动不超过 $da$ 和 $db$ 的距离,问先手能不能追到后手。
三种情况必胜:
证明我吐了,有时间再来补。
给定一个序列 $a_i$,如果 $a_i = i$,那么你可以将它删掉,多次询问如果强制前 $x$ 个数和后 $y$ 个数都不能删,最多能删几个数。
发现问题的可二分性,巨佬题解。
设 $\text{lim}_i$ 表示如果禁止删除的长度 $\le \text{lim}_i$,那么该位置可以被删,否则不能被删。
考虑二分求解,对于我们正在二分的 $\text{mid}$,等价于求前面满足 $\text{lim}_j \ge \text{mid}$ 的有多少个,这个过程可以使用主席树优化到 $O(n \log n)$。
对于询问,直接询问 $[1,n-y]$ 中 $\text{lim}_i \ge x$ 的个数即可,主席树上查询即可。
交互题,给定 $1$ 到 $2n$ 共 $2n$ 个数,你可以选择当 A 或 B。
你需要选择一个角色扮演并获胜。
给定一个 $n \times m$ 的方格图,分黑白格,要求用 $1 \times x$ 和 $x \times 1$ 的砖块铺满所有黑格,白格不能放砖,且所有砖不能重叠,问最少需要多少砖。
给定一个序列 $a_i$,将其拆分成两个序列 $b_i$ 和 $c_i$,要求满足 $a_i=b_i+c_i$,且 $b_i$ 递增,$c_i$ 递减。求 $\max(b_i,c_i)$ 的最小值。多组询问,每次对 $a_i$ 进行区间加。
$\max(b_i,c_i)$ 等价于 $\max(b_n,c_1)$,在 $b_1$ 和 $c_1$ 固定时,$b_i$ 的增量越少越好,所以如果 $a_i > a_{i-1}$,那么将多的部分加到$b_i$ 上面,否则将多的部分减到 $c_i$ 上面。因此答案为 $$\max(b_n,c_1)=\max(x+\sum_{i=2}^n\max(0,a_i-a_{i-1}),a_1-x)$$ 设 $y=\sum_{i=2}^n\max(0,a_i-a_{i-1})$,则答案为 $\max(x+y, a_1-x)$,直接取 $x=\lfloor \frac{a_1+y}{2} \rfloor$ 即可。
修改时,区间加只会改变两个点的差分值,因此可以 $O(1)$ 维护。
有 $n$ 个怪,每个怪物有一个攻击力 $d$。有 $m$ 个武器。每个武器有两个属性,耐久度 $a$ 和 防御值 $b$。对于一个打怪顺序,按顺序处理每一个怪:
对于每个武器,所有 $n!$ 种打怪顺序出现概率相等,求期望收到的伤害。
考虑先把所有怪按攻击力排序,那么对于一个武器,设 $d \ge b$ 的怪物有 $x$ 个。那么对于这 $x$ 个怪物,他能造成伤害当且仅当他前面至少有 $b$ 个怪物属于这 $x$ 个怪物,概率为 $\frac{x-b}{x}$;对于剩下 $n - x$ 个怪物,他和上述 $x$ 个怪物的相对顺序相当于插空,他能造成伤害当且仅当上述 $x$ 个怪物至少有 $b$ 个在它前面,概率为 $\frac{x+1-b}{x+1}$。
期望还需要乘以怪物他们自己的攻击力,上述 $x$ 个怪物和 $n-x$ 个怪物分别是一个后缀和前缀,因此求个前缀和乘上即可。
给定一个序列,问有多少个连续的子序列其中每个数字都恰好出现了三次。
那么从左往右扫一遍利用线段树维护以当前位置为右端点有多少合法的左端点,对于每个数,将对于他来说不能选的区间覆盖,能选的区间消除覆盖,这样所有覆盖次数为 $0$ 的下标即看成为合法左端点。处理出每个位置往左第 $i(1 \le i \le 3)$ 次出现的位置 $p_i$,那么 $[1,p_3]$ 无法选,覆盖一次;$[p_1, i]$ 是新产生的不能选的区间,覆盖一次;$[p_3 + 1, p_2]$ 可以选,取消覆盖一次。
使用标记永久化(不下传)即可完成。
二维平面上 $n$ 个点,如果两个点的横坐标或纵坐标相同,那么可以在它们之间连边,边的长度为两者距离之差。现在可以额外添加一个点,问能否使图联通,如果可以,所有边最大值的最小值是多少。
二分答案 $\text{mid}$,那么所有横坐标相同或纵坐标相同且距离不超过 $\text{mid}$ 的点之间可以连边。我们对连通块的数量分类讨论:
时间复杂度 $O(n^2)$。
给定一个 $\texttt{01}$ 串,每次操作可以交换相邻的两个 $\texttt{0}$ 和 $\texttt{1}$,问至多操作 $0$ 到 $\frac{n(n-1)}{2}$ 次,两者中间至少有一个 $\texttt{1}$ 的 $\texttt{0}$ 的对数最大值。
答案等于任意选 $\texttt{0}$ 的对数减去在连续 $\texttt{0}$ 段选的对数。
设 $pos_i$ 为第 $i$ 个 $\texttt{1}$ 的位置,一共有 $cnt$ 个 $\texttt{1}$,$f_{i,j,k}$ 表示第 $i$ 个 $\texttt{1}$,已经到第 $j$ 位,操作了 $k$ 次需要减去的对数的最小值,有如下转移方程:$$f_{i,j,k}=\min_{t=0}^{j-1}(f_{i - 1,t,k - |pos[i] - j|} + \frac{(j - t - 1) * (j - t - 2)}{2})$$ 对于每一个状态,最后还要减掉最后的一段 $\texttt{0}$,即为 $$ans_i=\frac{(n - cnt)(n - cnt - 1)}{2} - \min_{j=1}^{n}(f_{cnt,j,i}+\frac{(n - j)(n - j - 1)}{2})$$ 时间复杂度为 $O(n^4)$。
给出一张无向图,一开始第 $i$ 个点上面写着数字 $i$,有如下两种操作:
考虑逆向过程,将删边改为加边,建出 Kruskal 重构树,非叶节点的权值代表子树中是第 $i$ 次删边操作前可以到达的连通块,之后倍增找祖先再套一个线段树维护 dfs 序,维护最小值和修改最小值即可。
$m$ 个集合,里面放 $1$ 到 $n$ 的正整数。对于集合 $i$,如果里面有元素 $j$ 和 $k$,则在它们之间连一条颜色为 $i$ 的边。删除集合 $i$ 里面的数 $j$ 需要耗费 $a_i + b_j$ 的金钱,问使图不存在所有边颜色均不相同的环最少需要耗费多少钱。
新建 $m$ 个点代表每个集合,将集合里每个元素像对于集合代表的点连边,可以发现这样构造后原图有彩虹环等价于新图有环,直接求最大生成树即可,然后用总权值减去生成树上的边权之和。