摘要:
基础知识 单源最短路 Dijkstra void dijkstra() { memset(vis,0,sizeof vis); memset(dis,0x3f,sizeof dis); dis[1]=0; for(int i=1;i<=n-1;i++) { int p=0; for(int j=1; 阅读全文
摘要:
原题链接 原题链接 算法介绍 整道题可以分成两部分来看。 对于仅有一行的部分: 整个矩阵退化为一个序列,整个问题就变成一个序列上的问题。 简化题意:给定一个序列,每次询问在一段区间内取若干个数,其总和是否能够大于一个给定值。 考虑如下做法: 对于每次询问,二分一个权值t,判断区间内权值大于等于t的所 阅读全文
摘要:
原题链接 原题链接 算法概述 f[i]表示从1号点开始到当前站点下船所需的最少价值。 对于f[i],考虑枚举最后一次租船的起始站点j,1<=j<=i-1, 则有f[i]=min{f[j] + w[j][i]} 边界,显然在1号点时无需付钱,f[1]=0。 注意要求最小值,故初始化正无穷。 参考代码 阅读全文
摘要:
静态区间第k小数 原题链接 算法概述 我们在“值域”上建立线段树。每个节点维护一段值域区间[L,R],并记录序列中数值落在这段值域区间[L,R]内的点有多少个,记为cnt。 先不考虑下标区间[l,r]的限制。对于询问整个序列A1~An中的第k小数,我们执行线段树的查询操作,对于每个线段树上的节点,只 阅读全文
摘要:
原题链接 原题链接 算法概述 读完题目,显然可以用主席树做。 把所有的插入与撤销操作看成一个序列,按其操作顺序编号,则下标最多为1~n(因为有查询操作的存在,下标实际上不可能到n)。 在下标上建立主席树。 每个节点记录其所代表的下标区间内已经插入的字母个数。特别地,叶子节点需要额外记录其下标所对应的 阅读全文
摘要:
前言 虽说,成大事者不拘小节,但是,细节决定成败! 数据结构 1. 树链剖分预处理的dfs1和dfs2函数内部递归不要写成dfs 2. 线段树加法标记在计算的时候要乘上区间长度:sum(son)=add(p)*(r(son)-l(son)+1) 3. 树链剖分常规操作函数里面线段树节点从1开始,而不 阅读全文
摘要:
链接 原题链接 算法概述 显然,对于图中任意一个强连通分量来说,只要将软件发给其中任意一个点,就可以到达该强连通分量中的其他所有点。 基于此,我们容易想到先用Tarjan算法求强连通分量,再缩点,从而简化整张图,方便我们思考。 缩完点之后这张图就变成了一张有向无环图,第一问是求将一个软件至少直接发给 阅读全文
摘要:
概念 差分约束系统是一种特殊的N元一次不等式组。它包含N个变量x1~XN以及M个约束条件,每个约束条件均形如xi-xj<=ck,其中ck是常数,i,j∈[1,N],k∈[1,M]。 检索 应用一:求该N元一次不等式组的一组可行解 应用二:求满足约束条件的xi的最大值或最小值 应用一 首先xi - x 阅读全文
摘要:
说在前面 首先这题单纯从数据出发的话,直接做SPFA,加点优化,SLF或者LLL的话是可以直接过的。 但是,本着科学严谨的态度,极其不推荐使用这种投机取巧的偷懒方式。而且如果数据是特殊构造的话,就算加了优化也一样会被卡。故此处介绍正解。 算法介绍 算法描述: 考虑到本题有个非常好的性质:有向边必然无 阅读全文
摘要:
问题抽象: 给定一张无向图,求出一条1~n的路径,使得路径中第k+1大的边权最小化。 算法描述: 二分答案。 对于二分的值mid,定义在所有1~n的路径中,满足权值大于mid的边的数量小于等于k者为合法路径。 当mid越大时,权值大于mid的边的数量必然非严格单调递减,故而合法路径的数量必然也非严格 阅读全文