随笔分类 -  算法-构造/结论/找规律

摘要:先考虑 k 是偶数的情况,此时 k 必须是 2n 的约数,且不能是 n 的约数,并且 k 要尽量小,所以令 k = 2 的 (n 里 2 的最高次数 + 1) 次方即可。若 k 还是太大,说明偶数无解,考虑奇数。此时有一个非常巧妙的想法:令 k2 = 2n / k。会发现这个 k2 一定是满足条件的。 阅读全文
posted @ 2022-04-10 13:17 duyiblue 阅读(110) 评论(0) 推荐(1) 编辑
摘要:从 i 向 b[i] + 1 连边,得到一棵树。考虑分层,问题转化为构造一个数组,使得每个节点的值小于父亲的值,但大于父亲同一层左边节点的值。在 dfs 离开一个节点时记录的 dfs 序就满足这个要求。 阅读全文
posted @ 2022-03-17 21:18 duyiblue 阅读(141) 评论(0) 推荐(0) 编辑
摘要:以第一个关键节点为根。根据:v 在 x, y 的路径上,当且仅当 dis(v, x) + dis(v, y) = dis(x, y),可以确定每个关键点到根的路径。接下来按深度从小到大加入剩余的节点。只需要在已经确定的部分里为它找到一个父亲即可 阅读全文
posted @ 2021-03-15 13:09 duyiblue 阅读(244) 评论(2) 推荐(0) 编辑
摘要:对值域分块,每块内按原序列里的位置排序。查询时把每块内下标在 [l,r] 之间的提取出来,依次合并。问题转化为预处理出每块内的所有区间对应的集合。可以在值域上分治。每次把小于等于 mid 的元素和大于 mid 的元素,按原顺序分在两边,递归求解后,再把两边的答案合并。 阅读全文
posted @ 2021-02-03 01:06 duyiblue 阅读(218) 评论(0) 推荐(0) 编辑
摘要:构造题, 交互题选做。还会选入一些其他妙妙题 阅读全文
posted @ 2021-02-02 20:49 duyiblue 阅读(2808) 评论(23) 推荐(14) 编辑
摘要:首先发现每个字母会对答案有一个贡献系数,是 1 或 -1。结论是,除了 n 的系数必须是 1,n - 1 的系数必须是 -1,其他数的系数可以任意选择。于是问题转化为选择系数,使得和为 T。可以从大到小贪心。本文将证明其正确性。 阅读全文
posted @ 2020-12-24 14:16 duyiblue 阅读(334) 评论(1) 推荐(2) 编辑
摘要:考虑序列里唯一的、出现次数最多的数 x。结论:最长的好的子段,一定满足,x 是其中出现次数最多的数之一。然后可以枚举另一个出现次数最多的数 y。把 x, y 分别看成 1, -1,其他数看成 0,则问题转化为求最长的、和为 0 的子段,这很简单。在 D2 里,根据出现次数最多的元素的出现次数,进行根号分治,出现次数大时,可能的值就少,可以套用前一种方法。出现次数小时,可以枚举出现次数,做 two pointers 阅读全文
posted @ 2020-11-19 21:01 duyiblue 阅读(1077) 评论(0) 推荐(5) 编辑
摘要:分 n 为奇数和偶数两种情况。奇数时,容易用人类智慧构造出一种方案。偶数时,考虑何时有解,何时无解。发现一次操作不会改变所有数的异或和。那么,有解的必要条件是,所有数异或和为 0。发现此时,随便拿出一个数,对剩下 n - 1 个数按奇数的方法构造即可。 阅读全文
posted @ 2020-11-19 19:17 duyiblue 阅读(526) 评论(1) 推荐(2) 编辑
该文被密码保护。
posted @ 2020-09-14 00:27 duyiblue 阅读(54) 评论(0) 推荐(0) 编辑
摘要:n为偶数时先手必胜。n为奇数时,所有数之和mod 2n=n,所以只需要找出一个和是n的倍数的方案即可。容易证明,一定存在一种方案,把mod n=0,1,2,...,n-1的数各选一次 阅读全文
posted @ 2020-09-07 12:31 duyiblue 阅读(353) 评论(3) 推荐(1) 编辑
摘要:m=n-1时一定有解,策略是取最小的和最大的原材料拼成一道菜,然后转化为m,n分别小1的子问题递归下去。m>=n时,可以先取最大的原材料,直到m=n-1。m=n-2时,用DP将所有原材料,划分成两个m=n-1的集合。DP的状态设计比较巧妙,同时需要用到bitset优化 阅读全文
posted @ 2020-08-26 11:31 duyiblue 阅读(304) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-07-27 20:43 duyiblue 阅读(11) 评论(0) 推荐(1) 编辑
摘要:先考虑一个排列的情况。从边界入手,先把a[n]搞成n,同时要保证前面的数,相对大小关系不变。可以依次交换(pos[a[n]+1],n), (pos[a[n]+2],n),...,(pos[n],n)。完成这一轮操作后,转化为一个规模减1的子问题,继续做即可。当不是一个排列时,对相同的数,我们强行令位置小的数更小,这样可以把原序列转化为一个排列,且逆序对不变。 阅读全文
posted @ 2020-07-05 16:22 duyiblue 阅读(705) 评论(3) 推荐(4) 编辑
摘要:4步以内,先手总能获胜。可以用逆推的思路来构造。 阅读全文
posted @ 2020-07-05 15:08 duyiblue 阅读(408) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-05-28 16:11 duyiblue 阅读(7) 评论(0) 推荐(0) 编辑
摘要:先将整个串划分为,尽可能少的、L,R交替的子序列,再将这些子序列拼起来。划分可以直接贪心,从左向右依次加入每个字符,没有能加入的子序列,就新开一个子序列。划分好后,构造拼接方案。将子序列分为LL,RR,LR,RL四类。LL,RR这两类可以先合并为一个LL,或一个RR,或一个LR。LR,RL这两类,可以合并为一个LR或一个RL。最后将剩下的不超过两个子序列拼接在一起即可。 阅读全文
posted @ 2020-05-25 19:21 duyiblue 阅读(349) 评论(1) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-05-18 11:30 duyiblue 阅读(7) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-05-07 14:07 duyiblue 阅读(1) 评论(0) 推荐(0) 编辑
摘要:题目链接 我们设$h(i)$,表示要到达点$i$,最远必须经过$h(i)$。特别地,如果永远无法到达$i$,令$h(i)=\inf$。那么,每个位置$i$,会在$\text\in[h(i),m]\(时成为一个能够到达的位置(其中\)\text\(表示可以走的范围为\)[0,\text]\()。因此最 阅读全文
posted @ 2020-04-25 22:04 duyiblue 阅读(224) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-04-24 21:11 duyiblue 阅读(6) 评论(0) 推荐(0) 编辑