线段树区间加,区间开根号,区间和查询。
根据吉老师的直播,我们可以感性的认识到在可以接受的时间内,区间开根号会使得区间逐渐相同。
对于一些线段树问题,我们不能一开始就把他当成是线段树,需要首先从全局修改查询的方式去思考。
我们维护区间最大值和区间最小值,在区间开根号操作上如果两者差距小于等于 1,我们进行更新。
此时,区间开根号的问题被转换成区间加和区间覆盖的双标记问题。
线段树区间加,区间开根号,区间和查询。
根据吉老师的直播,我们可以感性的认识到在可以接受的时间内,区间开根号会使得区间逐渐相同。
对于一些线段树问题,我们不能一开始就把他当成是线段树,需要首先从全局修改查询的方式去思考。
我们维护区间最大值和区间最小值,在区间开根号操作上如果两者差距小于等于 1,我们进行更新。
此时,区间开根号的问题被转换成区间加和区间覆盖的双标记问题。
对 $n$ 质因数分解。
将所有正偶数加在一起。
排序后从后往前加奇数,判断和是否为奇数,更新最大值。
预处理 s 串的每个后缀最小值和后缀最小值出现的位置。
遍历 s 串,找到后缀最小值,如果当前中间栈顶小于等于后缀最小值,则压入答案中。
之后将当前位置到后缀最小值全部压入中间栈内。
时间复杂度:$O(n)$。
对于一棵排序二叉树,每一个节点都有一条从根到当前节点的路径,这条路径决定了一个节点的最大值和最小值,如果这个节点在这个范围内,那么代表他可以通过这颗排序二叉树找到。
dfs遍历这棵树,维护路径上的最大值和最小值即可,用 set 记录可以到达的节点。
时间复杂度:$O(n+n\log(n))$。
首先注意到一种时间复杂度 $O(n^2)$ 暴力的方法。
第二,注意一种 dp 的方法,时空复杂度均为 $O(n^2)$ 。
但是发现如果 $k > \sqrt{n}$ ,那么第一种暴力的方法只需要 $O(\sqrt{n})$ 的时间。
而对于 $k \le \sqrt{n}$ ,使用第二种 dp 的方法,时空复杂度将为 $O(n\sqrt{n})$。
总体时间复杂度为 $O(n\sqrt{n} + q\sqrt{n})$ 。
1 | int head[maxn], to[maxn * 2], nxt[maxn * 2], d[maxn * 2], tot; |
1 | namespace hld { |
模拟。
当 $(x,y)$ 满足 $ d \le x+y \le 2n-d$ 并且 $-d \le y-x\le d$ 时,$(x,y)$ 在矩形内。
直接枚举分成了几段,计算每段的值,模拟一下即可。
数论构造。
求解方程 $ x \times y = \frac{2nm}{k} $ 的整数解 $(x,y)$ 。
如果 k 模 2 为 0,令 $k = \frac k2$, $ g=\gcd(n,k)$,则 $x=\frac ng$,$y=\frac{m}{\frac kg}$。
如果 k 模 2 为 1,令 $g=\gcd(n,k)$, 则 $x=\frac ng$, $y=\frac{m}{\frac kg}$, 注意到 $x = n$ 或者 $x < \frac n2$, 则可以令 $x = 2x$ 或 $y = 2y$。
对于原问题,将输入 $a_i$ 转换成一串表示该数二进制表示多少个1,实际上我们要求区间 $[l,r]$ 满足 $2|sum(a[l \dots r])$ 且 $\max(a[l \dots r]) <= \frac 12 sum(a[l \dots r])$ 的方案数。
对于 $a_i \ge 1$,则每个数至少有一位是 1,而位数最多只有60位,那么如果序列长度大于 60,则必然满足第二个条件。
因此对于每个位置,我们预处理他的后缀和为奇数和偶数的数量,那么不考虑第二个条件,左端点为 $l$ 对答案的贡献为 $cnt[i+1][sufSum_i % 2]$,对于长度小于 60 的后缀,暴力查询即可。
统计一下三种字符的个数。
如果每种有多于 $1$ 个字符,将其替换为没出现过的字符。
显然 $\gcd(i,i+1)=1$,直接输出即可。
统计只出现 $1$ 次的数字有哪些,如果有偶数个,对半分配即可。
出现两次的数字要么一人拿一个,要么一个人全拿,不影响答案。
出现次数大于 $2$ 的数字,如果已经可以分配了就全部给一个人即可;如果第一种是奇数个,那么分配一个出现次数大于 $2$ 的。
自闭题T^T。
考虑 $dp[i][j][state]$ 表示遍历到第 $i$ 列,有 $j$ 个联通块,第 $i$ 列状态为 $state$ 的方案数。
时间复杂度 $O(nk)=O(n^2)$。
1 | #ifdef XLor |
1 | namespace sieve{ |