摘要:就按(博主认为的)难度顺序排吧。 Sort It Out 分析 容易发现选出的集合一定是所有逆序对的一个最小覆盖集,那么剩下的就一定是一个LIS。仔细想想还可以发现字典序第$k$小的最小覆盖集的补集一定是字典序第$k$大的LIS,所以找到这个序列字典序第$k$大的LIS就好了。 代码 The Cow
阅读全文
摘要:分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解。 字典序最大有另一种理解方式,就是让越小的数尽量越靠后。 我们从树的根结点出发,从1开始填数,构造出来的一定是一组合法的解。 对于每种相同的数,可以通过线段树上二分逐个确定他们的最优位置,具体细节可以
阅读全文
摘要:分析 用到了两个小套路: 1. 使用线段树合并维护广义后缀自动机的$right$集合。 2. 查询$S[L,R]$在$T$中的出现次数:给$T$建SAM,在上面跑$S$,跑到$R$的时候先判匹配长度是否$\geq R L+1$,如果是则跳parent使$maxlen(x) \geq R L+1$的前
阅读全文
摘要:分析 题目要求有且只有一些位置是局部极小值。有的限制很好处理,但是只有嘛,嗯...... 考虑子集反演(话说这个其实已经算是超集反演了吧还叫子集反演是不是有点不太合适),枚举题目给出位置集合的所有超集,计算让这些位置成为局部极小值,而其他位置随意的方案数,这个可以通过DP,从小到大插入每个数解决。
阅读全文
摘要:分析 类似于点分治的思想,只统计经过分割线的最短路,然后把地图一分为二。 代码
阅读全文
摘要:分析 思维难度几乎为$0$的虚树码农(并不)题。 代码 cpp include define rin(i,a,b) for(register int i=(a);i=(b); i) define trav(i,a) for(register int i=head[a];i;i=e[i].nxt) d
阅读全文
摘要:分析 按$y$排序后CDQ分治,可以发现每个点可以影响的是$x$坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度$O(n \log^2 n)$。 通过归并排序可以显著减小常数。 代码
阅读全文
摘要:分析 一个月前做的一道题补一下题解,就简单写一写吧。 单独考虑每一个循环节,如果只进行内部的调整,最优方案显然是把最小的绕这个循环交换一圈。 但是借助全局最小值可能使答案更优,两种情况取个$\max$就好了。 代码 cpp include define rin(i,a,b) for(register
阅读全文
摘要:分析 测试点1、2: 搜索+剪枝。 测试点3: 只有一个抽屉,直接01背包。 测试点4、5: 每个物品体积相同,说明每个抽屉能放下的物品个数固定,建图跑费用流。 测试点6: 每个物品体积相近,经过验证发现每个抽屉能放下的物品个数仍然固定,费用流。 测试点7: 除了第一个物品,其他物品体积相同。所以可
阅读全文
摘要:分析 这回试了一下三级标题,不知道效果怎么样? 回到正题,二维最长上升子序列......嗯,~~我会树套树~~。 考虑$CDQ$分治,算法流程: 1. 先递归进入左子区间。 2. 将左,右子区间按$x$排序。 3. 归并处理左右子区间,在过程中使用树状数组加速$DP$。 4. 还原右区间,清空树状数
阅读全文
摘要:Dsu on Tree(树上启发式合并) 关于Dsu? 并查集(亦称Ufs)。 然而本算法和并查集并没有半毛钱关系。 有什么用? 可以在$O(nlogn)$的时间复杂度内解决大部分不带修改的子树信息查询问题。 算法过程? 一个dfs,可能还需要写一个辅助函数Add。 简述一下算法过程: 假设现在df
阅读全文