- 博客(502)
- 收藏
- 关注
原创 线段树+二分,CF 431E - Chemistry Experiment
如果这是最优解,那么 (k + 1) * h[k] - sum(h{0, k}) <= v <= (k + 2) * h[k + 1] - sum(h(0l, k + 1))令B[i] = (k + 1) * h[k] - um(h{0, k}),显然B[i] 单调递增,那么我们对于每个操作2,二分位置即可。选取一个上界top,低于top的瓶子我们先加到top,然后剩余的水平均加到这几个值为top的瓶子中。那么每次相当于选择一个k,把h[0, k] 调整为h[k],多出来的水,平均给0~k这些瓶子。
2024-08-24 20:47:11
115
原创 位运算,CF 878A - Short Program
最终的有效值为0,1,3,分别代表一定为0,为1,翻转。具体实现,我们可以初始化每个位为2,代表没有被操作。分别维护最终一定是1的位,一定是0的位,翻转的位。时间复杂度: O(10n)空间复杂度:O(1)顺序处理每个操作,每个操作按位处理。最终三个运算符对应的数分别输出即可。
2024-08-24 00:07:35
229
原创 二分+前缀和+思维,CF 1902D - Robot Queries
记 op[l - 1]后,坐标为(lx, ly),op[r] 后 为(rx, ry),询问(x, y),[l, r] 的 x偏移量为dx,[l, r]的y偏移量为dy。我们只需判断 (x, y) 是否在[0, l - 1] || [r, n]出现,以及[lx + dx1, ly + dy1] 是否在[l, r - 1]出现。反转后,相当于从(lx, ly) 走 (dx1, dy1) 到(x, y),再从(x, y) 走 (dx2, dy2) 到 (rx, ry)[0, l - 1] 的路径上的点不变。
2024-08-22 17:33:10
381
原创 二分+划分型dp,CF 360B - Levko and Array
a[i] 和 a[j] 能够同时不变的前提是我们能够通过修改 a[j + 1, i - 1] 使得 二者与相邻元素差值绝对值均不超过 二分值 x。定义 f(i) 为 第 i 个元素不变,前 i 个元素能够不变的元素数目的最大值。即 abs(a[i] - a[j]) <= (i - j) * x。时间复杂度: O(N^2logU)空间复杂度:O(N)我们二分 c(a),如何check?我们枚举上一个不变元素的下标 j。最小化最大值,提示我们用二分。
2024-08-22 16:31:06
352
原创 二分+数学,CF 689C - Mike and Chocolate Thieves
也就是说,上界不超过m,公比为k,的长度为4的等比数列的个数为 m / k^3。时间复杂度: O(m^(1/3) log m)空间复杂度:O(1)考虑一个长度为4的等比数列,ak, ak, ak^2, ak^3。check 累计数目是否合法即可。
2024-08-22 15:34:13
288
原创 二分+位运算,LeetCode 3007. 价值和小于等于 K 的最大数字
如果x >> i为奇数,那么有 (x >> i) / 2 * 2 + (x & ((1 << i )- 1)) + 1。和我们考虑第0位一样,就相当于向右移i位后,看第0位的1的个数,然后低i位有1 << i种情况,累计贡献。对于x >> i奇数的情况其实就是x 在第 i 位为1,然后此时低i位的选择取决于x的低i位。给定x,[1, x]内有多少数字第0位为1?如果x >> i为偶数,那么有 (x >> i) / 2 * 2。[1, x]内有多少数字第i位为1?的价值是它的二进制表示中在。
2024-08-21 17:56:11
351
原创 分治,1875C - Jellyfish and Green Apple
如果n % m / gcd(n % m, m) 不是2的幂,则无解。相当于先给每人分n / m个,然后把n % m个苹果分给m个人。时间复杂度:O(logN) 空间复杂度:O(1)否则,我们可以递归分治,也可以循环求解。n 不断 * 2 再 % m,累加贡献。n 个苹果分给m个人。
2024-08-21 16:31:34
229
原创 贪心 + 分层图bfs,newcoder 76652/B
由于路径长度为n + m - 1,所以只需增广 n + m - 1 次。bfs可以每次扩展一层,我们每次选择可扩展位置中字符最小的那些。时间复杂度: O(NMlogNM)空间复杂度:O(NM)以(0, 0) 为起点,进行bfs。这样我们会进行多路增广。
2024-08-21 13:46:45
253
原创 贪心+构造,CF 1592F1 - Alice and Recoloring 1
也就是说, > 1 次的操作4我们都可以换成1次操作4加若干次操作1。那么我们全用操作1,然后看能不能替换掉4个操作1为1个操作4。两次操作4 = 1次操作4 + 6次操作1,价格相同。一次操作4可以替代四次操作1,且更低廉。时间复杂度: O(NM)空间复杂度:O(NM)操作2、3可以被更低廉的操作1替代。只能替换一次,多了不会更便宜。
2024-08-21 11:45:21
415
原创 博弈论,CF 1600E - Array Game
如果LR都是偶数,那么就算先手前后来回换,我们一定会走到一侧没法拿另一侧为偶数,然后输掉游戏,因此。先考虑一侧,比如递增前缀,如果L是偶数,那么我们先手在左侧拿,后手一定也能在左侧拿。若L,R二者均奇,那么我们拿第一个元素大的那个,就会使得一侧不能拿,后手会落入。记最长递增前缀长度为L,最长递减后缀长度为R。若L,R一奇一偶,那么先手拿奇,后手就落入了。时间复杂度: O(N)空间复杂度:O(N)必胜态:L R 一奇一偶 或者 二者均奇。如果一直保持左侧拿,先手就输了。
2024-08-20 18:25:25
306
原创 最短路径树,CF 1076D - Edge Deletion
最短路径树中有n - 1条边,如果k > n - 1,那么我们保留n - 1条树边即可。时间复杂度: O(MlogM + nlogn)空间复杂度:O(N + M)否则,保留离源点最近的k个结点的前驱边。
2024-08-20 17:42:14
407
原创 思维+构造,CF 622D - Optimal Number Permutation
2 * n 的数组我们分为两部分,左边放奇数,从下标<0, n - 1>开始构造奇数组成的回文串,右边放偶数,从下标<n, 2 * n - 2> 开始构造偶数组成的偶回文串。第一感觉就是 能否构造出一个方案使得答案为0?时间复杂度: O(N)空间复杂度:O(N)如果这样,两个1之间距离为n - 1。n 之间随意,因为n - i = 0。对于上面的构造法可以手玩一下加深理解。最后剩下两个空位置放n。
2024-08-20 11:15:50
392
原创 并查集+思维,CF 1039C - Network Safety
我们按值考虑,一共有2 ^ k个值,我们预处理出cnt个不同的x,那么对于 2 ^ k - x个值,整个点集对于他们而言就是随便选的,每个值贡献是2 ^ n。那么对于所有的 a[u] ^ a[v] = x 的边构成的连通块,取x时只要有一个点被选整个连通块都得被选。考虑边<u, v>,如果 x = a[u] ^ a[v],那么u v 必须同时取/不取。对于每个x涉及的连通块,假如连通块为sz,那么每个连通块选或不选,贡献就是2 ^ sz。时间复杂度: O(N + M)空间复杂度:O(N + M)
2024-08-20 02:17:01
349
原创 计算几何,CF 993A - Two Squares
证明充分性其实也好证明,因为一个是正方形,一个是旋转45°正方形,如果二者相交且没有任何一个正方形的一个点被另一个包含,我们无法构造出中心不被包含的情况的。由于本题是正方形,只不过第二个正方形旋转了45°,那么我们可以考虑更简单的做法(因为判断线段相交也是有一些corner case的)对于(x, y) ,顺时针旋转45°后为((x + y) / sqrt(2), (x - y) / sqrt(2))由于数据量很小,可以暴力判断一个正方形的每个点是否在另一个正方形内。
2024-08-19 22:22:26
299
原创 调和级数枚举+dp,CF 822D - My pretty girl Noora
f(i) = min { f(j) + i / j * (j - 1) * j / 2 },即 将 i 个人分为 j 组。由于 [0, n] 所有 数的因子个数和为n ln n 级别的,所以我们只需计算n ln n次。我们外层枚举组数i,内层枚举每组人数j,i * j
2024-08-13 15:58:15
273
原创 缩点+树形dp,百度之星2024初赛第二场,染色
一条边按一个方向走后另一个方向走不了,想到桥,而且对于EBCC来说,一个连通块内因为边能走任意次,所以一个连通块可以任意染色。对于一个根节点u而言,走了一个孩子结点,其它就不能走了,所以孩子结点的染色方案间是加法关系而非乘法关系。则 f(u) = (1 + Σ(f(v) - 1)) * sz[u] ^ (k + 1)那么我们按照EBCC缩点后,由于起点定了是0,所以得到了一颗以0所在连通块为根的有向树。初值为1是全不染色的情况,-1是减去了全不染色的情况,避免重复计算。我们设u所在子树方案为f(u)
2024-08-12 23:03:46
348
原创 栈+观察,CF2002 E - Cosmic Rays
否则,计算t = min(psz, a),a -= t, len += t,psz -= t,如果psz == 0,那么弹栈。如果栈顶 <pb, psz>,pb == b,那么我们将二者合并即可,len += psz, 然后弹栈。对于新增的<a, b>,我们计算其存活时间len。我们用栈来维护处理过的段的值,以及存活时间。时间复杂度: O(N)空间复杂度:O(N)处理完后,将<b, len + a>入栈。到这里就可以想到用栈来维护了。个人感觉E比D的结论好观察。
2024-08-12 15:17:23
424
原创 单调栈+前缀和+二分,CF1998 E2 - Eliminating Balls With Merging (Hard Version)
如果pre[i] 存在,那么我们左合并,start[i] = max(start[pre[i]], b - 1),end[i] = end[pre[i]]我们二分查找b,b 是满足 acc[b] - acc[pre[i] + 1] >= a[pre[i]] 的最小下标(b >= i + 1)否则,我们右合并,start[i] = start[suf[i]],end[i] = end[suf[i]]那么 start[i] = i, end[i] = suf[i]对于有些DSU做法真的看不懂……
2024-08-11 20:13:26
555
原创 前缀和+单调栈,CF1998 E1 - Eliminating Balls With Merging (Easy Version)
如果sum(pre[i] + 1, suf[i] - 1) >= a[pre[i]],那么a[i] 可以和左边合并。如果sum(pre[i] + 1, suf[i] - 1) >= a[suf[i]],那么a[i] 可以和右边合并。合并意即,如果pre[i] 或者 suf[i] 中有一个可以留下,那么能够合并说明a[i] 也可以留下。对于a[i],我们记左边第一个大于a[i]的下标为pre[i],右边为suf[i]然后将下标按照元素值降序排序,依次处理即可。时间复杂度: O(N)空间复杂度:O(N)
2024-08-11 16:17:50
311
原创 中位数二分,CF 1998C - Perform Operations to Maximize Score
O(N)判断一个数x是否可以成为中位数:我们可以在k次操作内从数组中拿出 w 个大于等于x的数,其中w * 2 > n - 1。k 次 全加到最大值上面然后删除最大值,答案就是nums[n - 1] + mid(n - 1)其实前不久有一场就是中位数二分,可能对中位数check不太敏感。删除最大值,然后k次操作用来尽可能最大化mid(n - 1)时间复杂度: O(NlogU)空间复杂度:O(N)第二种情况我们如何最大化mid(n - 1)?我们只需二分一下最大的mid,如何check?
2024-08-11 12:22:04
314
原创 博弈dp,CF 731E - Funny Game
考虑 f(i) 为 某人先手取前 i 个,最终能得到的最大分差。要f(i) - f(j) = sumA'' - sumB''计算f(i) 时候 f(i) = sumA - sumB。那么转移的时候 f(j) = sumB’ - sumA‘时间复杂度: O(N)空间复杂度:O(N)假如A得分为sumA,B得分为sumB。游戏规则其实就是交替取前缀和。
2024-08-10 21:12:58
222
原创 离线处理查询,LeetCode 2940. 找到 Alice 和 Bob 可以相遇的建筑
但是这种直接借助数据结构的方式不利于思维的训练,这种题目往往可以使用离线处理 + 数据结构维护,往难了出可以主席树,整体二分,莫队……我们可以倒序遍历heights,维护一个单调栈,栈顶到栈底递增,那么遍历过程中,如果有询问,栈顶到栈底第一个大于的就是答案。查询(a, b)(a <= b),如果 height[a] < height[b] 或者a == b,那么答案就是b。将查询放到右端点b处,记保存每个下标作为右端点的查询,即 找到b右边大于height[a] 的最靠近b的索引。Bob 不能相遇,令。
2024-08-10 12:28:33
560
原创 思维,CF 1906B - Button Pressing
我们记前缀异或和为acc[],那么我们发现acc[i - 1] 和 acc[i] 的值交换,acc[i + 1] 不变。于是,判断可行性,我们只需看二者初始前缀异或和的1是否相等,以及操作第一个位置后,二者的前缀异或和是否相等。先不考虑开头和结尾的corner case,考虑一般情况下的操作相当于什么?s[i] 仍然是1,s[i - 1] 和 s[i + 1] 翻转。我们看操作s[n],会交换acc[n - 1] 和 acc[n]操作s[1],发现,除了acc[1],剩下的前缀异或和全部翻转。
2024-08-09 14:42:09
315
原创 贪心/前后缀优化dp,CF 575F - Bulbo
但是由于我们已经将点按照从小到大排序,所以可以脱绝对值,每轮提前预处理前后缀最小值,优化转移为O(1),这样的做法为O(N^2)的时间复杂度。那么 f(i, j) = cost(li, ri, a[j]) + min(f(i - 1, k) + abs(a[j] - a[k]))我们从x 移动到 [x, a] 内任意一点,总花费都是a - x,再靠右,花费变大,我们记 [l, r] 为本轮的。最小花费为r - a,要求我们上轮移动到[a, r],不会影响上一轮最小值。,此处l = x,r = a。
2024-08-09 13:43:32
332
原创 离线+树状数组,ABC253 F - Operations on a Matrix
当遇到操作2,我们将其影响的操作3(i, j)设置初值为 ans = x - col[j],(col[j] 为 第j列累加的值)时间复杂度: O(qlogm)空间复杂度:O(Q + N + M)所以我们先对询问离线处理,记录每个操作2影响到的操作3。操作3我们也可以通过树状数组来获取对应列的值。遇到操作3时 输出ans + col[j]我们通过差分树状数组,可以轻松解决操作1。关键是操作2会对操作3造成影响。
2024-08-08 22:07:28
205
原创 染色法+组合数学,CF 557D - Vitaly and Cycle
2:至少存在一条边,没有长度大于1的路径,那么固定一条边,然后选一个顶点即可,m * (n - 2)1:存在偶数长度路径,连接一下就行,对于每个连通块,我们二染色,连接相同颜色的两个点就能得到奇环。时间复杂度: O(N + M)空间复杂度:O(N + M)因此,我们先对原图二染色,然后根据情况计算答案即可。3:m = 0,方案为:C(N, 3)0:本身有奇环,样例说明方案为1。t 的取值范围为:[0, 3]
2024-08-08 18:44:35
165
原创 思维,CF 729D - Sea Battle
那么上面的方案可以击中a艘船,我们任意删去a - 1个射击位置,就可以保证击中1艘船,这样我们就构造出了方案。证明:用反证法,证明删掉1个可以命中n - 1,删掉2个可以命中n - 2……下意识想到对于每段0,每k个位置打一次,可以保证所有的船都被命中。时间复杂度: O(N)空间复杂度:O(N)?但是我们上面的这种方案还等价于什么呢。
2024-08-08 17:51:00
319
原创 贪心+位运算,CF 578B - “Or“ Game
因而我们最终答案一定是将x ^ k 乘在一个数字上的,这可以用反证法证明,如果分散在多个数字,我们总可以调整到位宽最宽的那个数字上得到更大的答案。由于x >= 2,所以乘一次x可以使得数字的二进制位数变多。因而我们枚举这个数字即可,或和可以用前缀和来优化。时间复杂度: O(N)空间复杂度:O(N)
2024-08-07 14:20:41
248
原创 状压DP,abc359_d - Avoid K Palindrome
我们定义状态f(i, j)为 考虑到第 i 个字母,右侧长度 k - 1子串二进制表示为 j 的合法字符串数目。拼接后为t,那么 f[i][j] += f[i - 1][t & ((1 << (k - 1)) - 1)]那么我们我们将s[i] 和 j 拼接后,我们可以轻松判断是否回文,这个可以预处理。我们发现长度为K的字符串,我们可以用0表示A,1表示B,用10位二进制就能表示。时间复杂度: O(n 2^k)空间复杂度:O(n 2^k)数据量:N:1000,K:10。
2024-08-06 22:56:37
418
原创 MST,CF 1468J - Road Reform
如果得到的最小生成树中没有大于k的边,我们把边集数组中abs(w - k)最小的边拿进来,会得到一个环,删去任意一条边,那么我们又得到一颗生成树,此时答案为min(abs(w - k))分析第二种情况的正确性,拿进来的边要么是我们MST中的最大边权边,要么是不在MST中abs(w - k)最小的边,所以一定是正确解。如果得到的最小生成树中存在大于k的边,那么我们的答案就是他们的权值 - k 的和。时间复杂度: O(MlogM)空间复杂度:O(M)如果直接求最小生成树会怎样呢?
2024-08-05 13:50:01
275
原创 欧拉图,欧拉通路,欧拉回路,Hierholzer算法详解
小岛与河的两岸有七条桥连接。又是板子题, 由于没说是通路还是回路, 所以我们先按无向图找通路起点, 找不到就说明是回路, 随便找个起点就行。我们继续观察,发现我们把数字当作结点,每块骨牌当作边,问题就转化成了一个有n条边的图,我们要让每条边出现一次。由于每个结点出度入度相等都为k,且强连通,于是图中存在欧拉回路,我们求欧拉回路即可得答案。本题时间限制卡在0.25 second,但是点也就7个,边也就200条,还是跑得飞快的。和无向图欧拉回路不同的是,该题要求所得的回路要经过每条边正向反向各一次。
2024-08-04 21:58:45
1783
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人