随笔分类 -  模板

摘要:最大流传送门 费用流传送门 网络流 很形象的定义:城市水管。 城市之间有许多水管,每根水管有一个最大容量,有一个源点(即出水点)s,和一个汇点t(回收水点)。 而最大流就是求最多能有多少水从源点流向汇点。 用找增广路的思想,每次不断找到增广路,更新答案。 注意要加反向边(返回操作),保证正确性。 但 阅读全文
posted @ 2021-03-09 23:41 尹昱钦 阅读(84) 评论(0) 推荐(0)
摘要:传送门 分块大法好 分块 什么是分块 就是把一连串的东西分成几个部分,通常是分成√n个部分,每个部分√n个数字,然后每一块分开处理。(当然有别的情况) 有什么用 时间得到了优化,把n变成了sqrt(n)*log(sqrt(n))。这是一种优雅的暴力呢 主要思路? 每一块内按照权值排序。对于每一次操作 阅读全文
posted @ 2021-02-04 10:25 尹昱钦 阅读(93) 评论(0) 推荐(0)
摘要:传送门 启发式合并 通俗点讲,就是将两个数据合并时,小的合并到大的里,这样就可以节约时间。 解题思路 再看看这个题,就是个板子题。 在两个节点信息合并起来时,让颜色数少的节点合并到颜色点多的节点上,实际操作时则是都是儿子的信息合并到父亲上,但是若儿子信息多于父亲,则交换一下信息(swap可做到O(1 阅读全文
posted @ 2021-02-04 00:49 尹昱钦 阅读(122) 评论(0) 推荐(0)
摘要:传送门 以这个做模板还是很纠结的…… 解题思路 01字典树,就是一个二叉的字典树,把许多数字二进制拆分,然后扔进字典树里,就可以进行许多骚操作。 回到这个题,朴素算法为预处理出每个点到根节点的路径的异或和,然后枚举任意两个点,把两个节点到根节点的异或和异或起来即为答案。原因是lca到根节点之间的路径 阅读全文
posted @ 2020-12-22 00:32 尹昱钦 阅读(207) 评论(0) 推荐(0)
摘要:传送门 解题思路 当然可以map水过(map大法好) 字典树也就是板子的插入查询操作。 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=10005; 阅读全文
posted @ 2020-12-13 18:06 尹昱钦 阅读(64) 评论(0) 推荐(0)
摘要:传送门 左偏树 政治老师告诉我们,要从以下方面思考问题: 是什么 为什么 怎么做 1.是什么:嗯……从字面看,是树(堆),是一个长得向左偏的二叉树(堆)。就长这样: 定义们: 外节点:当且仅当节点 i 的左子树或右子树为空时,节点被称作外节点。 距离:一个点的距离,被定义为它子树中离他最近的外节点到 阅读全文
posted @ 2020-11-29 23:26 尹昱钦 阅读(130) 评论(0) 推荐(0)
摘要:传送门 高斯消元 什么叫高斯消元? 就是解多元方程组的一种方法。 给你n个方程组,包含着n个未知数,告诉你每一个方程中的每一个未知数的系数和常数项。 怎么解? 和数学上差不多,把第一个方程保留第一个未知数(设系数为k),把第二个到第n个方程的第一个未知数的系数化为-k,用加减消元即可。 以此类推,枚 阅读全文
posted @ 2020-10-30 20:47 尹昱钦 阅读(149) 评论(0) 推荐(1)
摘要:传送门 缩点 在一个有向图上缩点就是指把有向图上的环变成一个点。 具体实现用Tarjan。 先求强联通分量,每次遇到新点是把这个点进栈,最后若dfn[i]==low[i]则i这个点一定在环上,而且栈中i之后进入的元素也在这个环上(证明略)。 即一直出栈,知道出栈元素等于i。在出栈过程中维护信息即可。 阅读全文
posted @ 2020-10-22 23:28 尹昱钦 阅读(154) 评论(0) 推荐(1)
摘要:传送门 解题思路 g[i][j][k]表示i到j这个点有没有长度为2^k的路径,若有为1,若没有为0。答案可以由g[i][x][k-1]&&g[x][j][k-1]更新(Floyd传递闭包)。 倍增求一遍后,把所有g[i][j][k] = 1 的 i j之间连一条长度为1的边(因为可以一步到达)。 阅读全文
posted @ 2020-10-20 23:31 尹昱钦 阅读(148) 评论(0) 推荐(0)
摘要:传送门 解题思路 很显然是dp(因为标签是dp)。 设dp[i][j]表示放到第i个原料,放完后的原料数量为j个最大的耐久度。 可以用dp[i-1][k]转移而来,其中k:j-1<=k<=min(w,j+s-1)。 你发现了什么,可以用单调队列优化! 即维护一个长度为s的单调队列。 //把这个题当做 阅读全文
posted @ 2020-10-18 00:05 尹昱钦 阅读(250) 评论(0) 推荐(1)
摘要:传送门 解题思路 求LCA一般可以用倍增、树链剖分、tarjan算法解决。 这里只介绍树剖。 先处理出每一条链的链顶,然后对于每两个要求的点,判断是否在同一条链上。如果在,那么深度较浅的点就是LCA。 如果不在同一条链上,就比较两个所在链的链顶的深度,把链顶深度较低的点跳到链顶的父亲(这样就保证有答 阅读全文
posted @ 2020-09-05 21:31 尹昱钦 阅读(189) 评论(0) 推荐(0)
摘要:传送门 树链剖分 简单点说,就是把一棵树变成多条链。 这里说的是重链剖分。 在遍历一颗树的时候,我们强制从父亲节点走向儿子时,先走所有儿子中以儿子为根的子树最大的那个儿子。 其他的儿子不管什么顺序都可。 这样就可以把dfs序作为链。 例如上面这棵树,边上的蓝色数字就是遍历顺序。 说一些定义: 重边: 阅读全文
posted @ 2020-07-05 16:16 尹昱钦 阅读(188) 评论(0) 推荐(0)
摘要:传送门 解题思路 区间dp:一般dp[i][j]表示区间i...j的答案,这个答案可以从某个或某些小区间转移而来。 大部分题的解法就是先枚举做外层循环len,表示区间长度,然后枚举区间左端点i,然后计算出右端点j,然后枚举i到j中的所有断点,根据dp[i][k],dp[k+1][j]计算出dp[i] 阅读全文
posted @ 2020-02-22 18:35 尹昱钦 阅读(197) 评论(0) 推荐(0)
摘要:传送门 真是一道毒瘤题(弄了接近一下午+一晚上) 解题思路 先对所有的点按照a-b-c的优先值从小到大排序,然后去重(注意要记录每一个有几个重复的,因为条件是小于等于,所以重复的对答案也有影响),然后再按照关键字b归并排序,排序过程中,用树状数组记录c值,每一次合并时如果是右半部分的b值较小,答案就 阅读全文
posted @ 2020-02-15 22:49 尹昱钦 阅读(140) 评论(1) 推荐(0)
摘要:传送门 解题思路 按照x的大小分治。 然后归并排序。 归并时按照y值。 然后步入难点: 假设我们已经求出了左半部分的最近距离和右半部分的最近距离,两个距离的较小值设为d。 然后我们把划分左右两部分的中线的x值定为midx。 很显然,最终的答案有三种情况: 两点在左半部分 两点在右半部分 一个点在左边 阅读全文
posted @ 2020-02-14 19:00 尹昱钦 阅读(470) 评论(2) 推荐(0)
摘要:传送门 解题思路 就是一道树形dp的模板。 偷得课件QAQ: 这个题用dp[i][0]表示i不去时以i为根的子树的最大快乐指数, dp[i][1]表示i去时以i为根的子树的最大快乐指数。 然后转移方程就很容易写出来了。见代码。 最后要注意输入的u,v是v是u的上司。 AC代码 1 #include< 阅读全文
posted @ 2020-01-17 20:51 尹昱钦 阅读(168) 评论(0) 推荐(0)
摘要:传送门 匈牙利算法 匈牙利算法(别名“找对象游戏”),就是给你一个二分图,求最大匹配。 最大匹配就是做多能连多少条边。 我们把这个抽象的概念转化成现实问题——找对象。 男女两组,男生A组,女生B组,每一个男生都有自己喜欢的女生(可能不止一个),作为上帝的你,尽可能的让更多的人成为男女朋友。 怎么做呢 阅读全文
posted @ 2020-01-12 01:33 尹昱钦 阅读(381) 评论(1) 推荐(0)
摘要:传送门 解题思路 个人认为这根本不是模板,而这题更倾向于LCS在某种特殊情况下的一种优化时间的方法。 真正的模板:LCS模板 这道题就是在两个字符串都是1~n的全排列时可以把时间复杂度从n2优化到nlogn。 把s2中的每一个元素在s1中的位置用一个数组记录下来,然后对这个数组做一遍最长上升子序列( 阅读全文
posted @ 2020-01-02 23:46 尹昱钦 阅读(250) 评论(0) 推荐(1)
摘要:传送门 解题思路 很显然的最长公共子序列(LCS)的板子。 定义:用dp[i][j]表示S1前i位和S2前j位的最长公共子序列。 状态转移: 当s1[i]==s2[j]时,dp[i][j]=dp[i-1][j-1]+1; 当s1[i]!=s2[j]时,dp[i][j]=max(dp[i-1][j], 阅读全文
posted @ 2020-01-02 23:38 尹昱钦 阅读(213) 评论(0) 推荐(0)
摘要:最长上升子序列 传送门 题意 对于给定的一个n个数的序列,找到它的一个最长的子序列,并且保证这个子序列是由低到高排序的。 例如,1 6 2 5 4 6 8的最长上升子序列为1 2 4 6 8。 基本思路 非常显然,这类题用dp求解。 dp[i]表示已i为结尾的最长上升子序列的长度,首先枚举每一个末尾 阅读全文
posted @ 2019-12-14 22:24 尹昱钦 阅读(829) 评论(0) 推荐(2)