08 2018 档案
摘要:传送门 经典的博弈 如果只有两堆 那么结束状态就是(0,0) 考虑先手 怎样保持后手面对(0,0) 如果两堆大小不一样 那么先手只要保持两堆一样大就行了 即 先手先取大的一堆 使两堆一样大 后手无论取多少 先手只要在另一堆取一样多 最后就一定是后手面对(0,0) 但是如果两堆一样多... 那先手取完
阅读全文
摘要:传送门 肯定是博弈论啦 因为大家都"完美地操作" 所以结果是肯定的 那考虑怎样先手才能控制必胜局面 设大的数是 a,另一个数是b 如果把数变成 b,a%b的局面必胜 那先手肯定走这一步,先手必胜 如果b,a%b的局面必输 那先手就要尽量避免,而且要尽量让后手变成 不得不取成b,a%b的必输局面 考虑
阅读全文
摘要:传送门 DP 注意到m<=2 那就很好搞了 又发现n<=100,k<=10 随便暴力DP都可以了 然后注意一下 可以选空矩阵 状态直接设:f[ i ][ j ][ k ] 表示 第一行 已经选到第 i 个数, 第二行 已经选到第 j 个数,一共选了 k 个矩阵 那么 f[ i ][ j ][ k ]
阅读全文
摘要:在数轴上找一点使得该点到所有其他点的距离之和最小 方法:找到大小为中位数的点,该点就是要求的点(如有两个取之间任意一点都行) 证明: 先看看当只有2个点时的情况: 分类讨论: 如果在A的左边(如 ),距离之和( )为:$dis(P_1,A)+dis(P_1,B)=dis(P_
阅读全文
摘要:传送门 算法 : 瞎搞...... 这种题是真的恶心.... 以下为一堆的结论和证明... (自己口胡的,比较细,实在不想看也可以直接看结论) 首先如果要让每个人最终的糖果一样多 1.那么肯定最终每个人的糖果数量为 每个人糖果数量的平均数..(显然...) 还有一个显然的结论: 2.如果 a 把糖分
阅读全文
摘要:传送门 如标题,主席树模板 稍微介绍一下主席树.. 主席树是很多个线段树的结合体 利用了单点修改不会更新太多节点的结论(反正这一题是这样..),后一个线段树借用前面线段树的节点,而对于更新的节点才开一个新的节点存储数据,大大的节省了时间和空间 (除第一颗树外其他树的构建只要log(n)的时间和空间)
阅读全文
摘要:传送门 算法:最大生成树 & LCA 题目要求两点之间最小边权 的最大值.. 就是两点之间有多条路径,每条路径有一个 最小边权 要找到最大的 最小边权 考虑kruskal算法的过程 如果我们每次把能使图两个块联通的最大的边加入图中 那么最终出来的图就称为最大生成树 显然 在最大生成树中,两点之间的路
阅读全文
摘要:传送门 瞄一眼 显然DP 再瞄一眼 方程就出来了: 设f[ i ][ j ]表示考虑到第 i 颗树,已经种了 j 颗的最大价值. 则 f[ i ][ j ]=max(f[ i-1][ j ],f[ i-2 ][ j-1]+value[ i ]); 最后看了眼数据.. 凉了.... 考虑优化 想死也想
阅读全文
摘要:传送门 莫队 看一眼感觉是数据结构.. 怎么看都是数据结构... 但是呢,数据结构要怎么搞我不会啊 换个思路,莫队 一下就会搞了.. 稍微讲一下莫队: 莫队的思路很简单 首先考虑如果只是询问一个区间 从区间左边开始,累加答案,一直到右边 但如果已知一段区间的值,要搞另一段区间的值呢 首先把已知的区间
阅读全文
摘要:传送门 二分图 匈牙利算法 重要的是怎么建图(怎么看都不像二分图....) 仔细看还是能发现的.. 两个操作不管怎么搞,在同一行的永远在同一行,同一行的 1 想怎么左右换都可以 所以根本不用上下交换(如果下面没有1,换了以后上面就没有1了) 题目要让对角线上的每个点都有1 就是把对角线的点与 1 匹
阅读全文
摘要:传送门 树链剖分 树链剖分就是把一颗树分成很多条链,然后把链上的数据进行瞎搞操作(本题是用线段树区间修改) 一步一步慢慢讲: 1. 从根节点开始对整颗树进行一次遍历 求出每个节点子树的大小,父节点,深度和重儿子 重儿子指 儿子子树大小最大 的儿子节点 (做这些都是为了后面瞎搞) 2. 再来一次遍历.
阅读全文
摘要:传送门 DP 题目讲得很清楚"对于电路板的任何两个节点,都存在且仅存在一条通路". 所以电路板是一颗树 题目要求叶子节点时态一致 如果从根开始枚举时间肯定超时 考虑反过来 从叶子节点开始考虑时间 容易注意到 对于一个子树的根 root 来说 不管上面用了多久把信息传下来 要让它的儿子收到信息的时间相
阅读全文
摘要:传送门 并查集 起初我也不懂,后来是看了题解才懂的 感谢https://www.luogu.org/space/show?uid=79044 尽力讲清楚吧.. 带权并查集.. 并查集在路径压缩时顺带把并查集上的边权也压缩 设 sum[i] 表示船 i 前面有多少船,不包括 i 求两船之间有多少船,只
阅读全文
摘要:传送门 并查集 数据较大 直接用tarjan求联通块会超时 注意到只有删除没有添加 如果是只有添加就很容易用并查集求联通块 所以考虑把过程反过来 即 一开始是没有边的 然后逐渐添加边 把联通块数量存起来 再输出就好了.. 一开始先遍历一遍最终状态,求出联通块数量 然后慢慢加边,存一下答案 顺便注意一
阅读全文
摘要:传送门 DP 注意虽然数据小但是搜索还是会超时 不能搜索 考虑DP: 但如果强行DP还是不够 那考虑优化: 每个格子只有两种状态: 选 or 不选 (当然如果这个格子是"贫瘠的"就一定不能选) 明显可以用一个2进制表示 而整行的状态就可以用一串2进制表示 状态的压缩就完成了 可能有人会疑惑n,m最大
阅读全文
摘要:传送门 二分图 稍微讲一下二分图: 就是一个图分成两个部分A和B,这个图的无向边只连接不同的两个部分,即边不能在A或B的内部自己连自己 然后问你最大能找到多少匹配 匹配是指 A中的一个点与B中的一个点有边 并且 这两个点都还没有与其它点匹配 这种问题一般用匈牙利算法: 匈牙利算法的思想很简单 对于一
阅读全文
摘要:传送门 主席树解法设las[ i ]表示数列中第 i 个数的值 上一次出现的位置,num[ i ]为原数列中第 i 个数的值1. 把 从第 1 到第 i 个数的 las 的值 的出现次数 建立一个线段树那么第 i 个叶子节点 i 就表示 las 值为 i-1 的出现次数对于序列 1 2 1 3 4
阅读全文
摘要:传送门 显然是DP容易想到状态压缩:按行处理,按列表示状态状态显然,这一列放0个,放1个,放2个然而还是不够..继续优化换种思路:设f[i][j][k]表示处理到第i行,并且这i行m列中有j列放了一个棋子,k列放了2个棋子,其他的没放。好了状态出来了转移也就好写了..看代码就好了..可以用滚动数组,
阅读全文
摘要:传送门 DP数列长度过大无法枚举,考虑DP设f1[i]储存以第i个字符为结尾时,的最后一个数最小时,这个数的开头的位置(很难想有木有)OK,状态有了,方程想一想就出来了:设为数列中从i到j的数连起来后的值,为数列长度则如果$num[ j ][ i ]>num[ f1[
阅读全文
摘要:传送门 DP其实主要是单调队列..数据最大为一千,考虑O(n^2)的做法在a*b的矩形中找出n^n的正方形再怎么样至少也要把a和b分别枚举吧。必须考虑O(1)处理单个正方形最大最小值。容易发现正方形大小不变为n,如果只看一行,就是滑动窗口,那么处理单个正方形最大最小值时间复杂度为O(n);仔细思考后
阅读全文
摘要:传送门 现在看看自己早期的题解真是惨不忍睹...(upd in 2019.8.11) 算法 最短路+DAG上的dp+建图 思路 首先是求最短路,但是题目没给出边的范围,所以我选用 求最短路,SPFA可能会爆炸 先分别求出以两个人为起点的单源最短路径,然后判断一条边 $(a,b)
阅读全文