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