随笔分类 - 洛谷
摘要:Jennie 反悔贪心 显然要把逃生能力弱的先送出去,也就是排个序。 这时候剩下的怎么办,万一有一些手长腿短的怎么办 先假设所有小矮人站成一排,然后一个个逃。 逃无可逃时候,看看把已经逃出去的中腿最长的拉下来会不会答案更优。 #include<cstdio> #include<iostream> #
阅读全文
摘要:Jinnie 看到莫名其妙的异或题,应该考虑按照位数处理。 这样我们分别考虑每一位的答案,需要先取模。 排序,让序列有了单调性,并且可以观察到,对于第k位只有两个数的和属于 $[2k,2{k+1}-1]\cap[2^{k+1}+2k,2{k+2}-2]$才行 最后的右边界是什么东西?我们取模了啊.
阅读全文
摘要:Jisoo 众所周知,这个式子就是$\sum_{i=1}^n(k-i*\lfloor\frac{k}{i}\rfloor)$ 也就是$nk-\sum_{i-1}^n(i\lfloor\frac{k}{i}\rfloor)$ 右边的东西用数论分块+等差数列搞一下就可以了 数论分块的每一块的右边界是$\
阅读全文
摘要:可持久化线段树 如果我们要维护一个可持续的,支持查询历史版本的数组该怎么做 给每一个版本建立一颗线段树?那太占空间了。 我们可以不同版本公用一些节点,对于每个版本,只把和上一个版本不一样的部分建立线段树的新节点。这样我们就有了可持久化线段树。 Lisa 需要的前置知识:动态开点。 依照上面的思想,这
阅读全文
摘要:左偏树 一种可以合并的堆 前置知识 dist 对于一棵二叉树,我们定义 外节点 为左儿子或右儿子为空的节点,定义一个外节点的 为 ,一个不是外节点的节点 为其到子树中最近的外节点的距离加一。空节点的dist为0。 那么左偏树就是一颗满足堆的性质的二叉树,它的左儿子的dist大于等于右儿子的 核心 核
阅读全文
摘要:左偏树 一种可以合并的堆 前置知识 dist 对于一棵二叉树,我们定义 外节点 为左儿子或右儿子为空的节点,定义一个外节点的 为 ,一个不是外节点的节点 为其到子树中最近的外节点的距离加一。空节点的dist为0。 那么左偏树就是一颗满足堆的性质的二叉树,它的左儿子的dist大于等于右儿子的 核心 核
阅读全文
摘要:Treap treap是啥,是一种平衡树,tree+heap 众所周知,二叉平衡树一旦退化,复杂度将会很可怕。 treap则给每一个节点附上了一个随机的值,然后利用旋转操作,让这个二叉搜索树同时也满足堆的性质。期望下可以达到$O(nlog_n)$的复杂度了。 具体怎么实现呢 大部分的操作和一般的二叉
阅读全文
摘要:Lisa 显然的贪心思路就是用田忌最大的和齐王最大的进行比较,如果不能,就从小到大找到第一个没有贡献的马,用它换掉最大的 马,重复以上操作 什么叫没贡献的马,最弱的马和最弱的马进行比较,如果田忌的最弱的赢不了,他就是没贡献的 为什么不能简简单单的去最垃圾的马去换 这样可能造成不必要的浪费,既然他能做
阅读全文
摘要:wqs二分时间 给定 个物品,我们需要在其中恰好选择 个,并且需要最大化收益。设对应的收益为 ,那么需要满足在最大化收益的前提下,每多选择一个物品,额外产生的收益是单调递减的,也就是 。同时,如果我们对物品的选择数量没有限制,即 不存在,那么我们应当能够快速地计算出最大的收益,以及达到最大的收益需要
阅读全文
摘要:jisoo 典型的CDQ分治 一维的时候比较就行了 二维的时候加一个数据结构,就像逆序对一样 三维的时候则需要,使用CDQ分治来解决了 首先把全局按照第一维从小到大排序,相同的按照第二维,还相同的按照第三维 然后开始从中间分开,分治。 显然这个过程位于 \(mid\) 两边内部的都会在自己的过程中被
阅读全文
摘要:Lisa 贪,就硬贪 显然当权值最大的那个点可以选了之后,必须立马选它答案才会最有 既然这个点必须立即选的话,那么何不把它和父亲合并起来,取个平均值 然后这颗新树上重复这个操作 就可以得到一个染色的顺序 #include<iostream> #include<cstdio> #include<cma
阅读全文
摘要:Lisa 对于这样的贪心题,很容易想到按照某个顺序排个序,比如说最小的spfa值递减 因为这样的话,对于每一瓶防晒霜,要不前面的牛能用,要不只有前面的牛能用 这样为了给后面省出尽可能多的防晒霜,不如把能用的最大的给前面的牛 也确实如此 #include<iostream> #include<cstd
阅读全文
摘要:Miku 如果我们知道哪两个点可以用跑路机1s到达就好办了 怎么知道呢?如果两个点的距离可以为$2k$,那么一定有一个中转接点,到两个点的距离都是$2{k-1}$,也就是如此了。 这样显然可以用$floyd$预处理出来距离 #include<iostream> #include<cstdio> #i
阅读全文
摘要:Miku 这个题可以用树hash做 怎么搞呢,对于一棵树,我们要用hash记录他的形态 对于二叉树,我们要记录的就是左儿子的hash和自己和右儿子。 然后进行比较 我采用的是对于左右儿子和自己乘上不同质数的方式 还有自然溢出,以及两次hash #include<iostream> #include<
阅读全文
摘要:Lisa 运用一点初中知识可以知道 维护一下区间平方和和区间和就可以处理了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int f; i
阅读全文
摘要:Lisa 显然一定会走$n-1$条边,会有一条边剩下走不了 这一条边是谁呢 这个图上有一个环,这个环呢上的每一个点,他走不到的那个边一定是在这个环上的和它相邻的那两个边当中的那个美观度较小的(显然等到回来的时候就是走完了) 对于不在换上的点,一定会走到环上,然后就和第一种情况一样了. #includ
阅读全文
摘要:Jennie 和常规的求逆序对差不多 在从根节点往下走的时候,我们必须要避免不在他子树内的点的影响 那就先减去他们呗。 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>
阅读全文
摘要:Jennie 经过一番思考,我们可以意识到最后数列里肯定只会有$0,1,-1$,这样我们就对此进行dp #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using na
阅读全文
摘要:Jennie 转移的时候要知道区间最值 那何不利用线段树来解决 \(O(nlogn)\) #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace
阅读全文
摘要:Jennie 因为要记录余数的问题,不能单纯追求最大 那么就加上一维来记录维数 再开一个数组记录是怎么转移的 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #includ
阅读全文