![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
解题报告
Fatdog Jo
想打ICPC呜呜呜
展开
-
图论专题 - 解题报告 - F
题目大意:单源,带环有向图中求多终点中最长路。有这样的题意,解法就很明显了,把环内的收益tarjan缩点为新的强连通分量,构造新图,从起点开始跑一遍spfa最长路循环找最优解就行了。但是首先,我们得先来了解一下tarjan缩点要怎么操作:TARJAN总的来说是需要一个递归函数来完成缩点,类似于dfs。递归过程中我们维护两个数组dfn[ ],low[ ],前者是点 i 的进入时间,后者是...原创 2019-06-10 19:52:38 · 136 阅读 · 0 评论 -
图论专题 - 解题报告 - E
这题是我最先开始做的一批题之一,糖哥tql,您带的榜可卡死我咯。一开始想到一个很单纯的套路,就是搜,最短路,最少代价最先到达,BFS走起冲冲冲,每次到下一个层次的新点就延申出一条边,一次性更新全部同色的边上点的深度。每次广搜扩展就有了很多跳过条件,能保证每条边最多遍历一次,这么听起来好像算是Om的算法?但是由于每次在一个点上判断次数过多,所以这么做基本上是必t的,加了算是优秀的剪枝也过不了19点。...原创 2019-06-10 19:51:40 · 165 阅读 · 0 评论 -
图论专题 - 解题报告 - D
问题大意就是给出多次询问,问两点间的最短路,首先知道每次都跑一遍最短路肯定是不现实的,总共1e5次询问你来?但是我们如果能预处理出一些两点间的最短路径关系就可以完成这样的查找了对吧。如果用上最小生成树呢?树覆盖了全部点,我们要最短路,要么在树上,要么过树外的一条边。树外这些冗余的点边关系就派上了用场,我把那些冗余边的端点称为坏点(badnode),两点(u,v)间的树上距离(u→→ v)可以用...原创 2019-06-10 19:51:05 · 158 阅读 · 0 评论 -
图论专题 - 解题报告 - B
先来看看我一开始以为这个题是什么吧。因为买下来的路就可以来回走动,所以就是买下来最小生成树就是代价,这是没有选择免费边的情况。如果能免费一条边呢,我们连出一个缺少最长边的最小生成树,保证代价最小,然后再连入最后一条边,如果最后一条边能连出整棵树,那么代价一定就是最小的,这样的情况有多少也很好计算。很可惜必不是正解,举出反例,如果最长边有好几条,这样的话绝对只会计入一种的情况,至于分类再枚举最长边讨...原创 2019-06-10 19:49:29 · 147 阅读 · 0 评论 -
图论专题 - 解题报告 - A
重要结论:如果有在一颗有向边的DAG上(无环),连上一条新边,一定存在一个方向使得这个新图依旧无环。原创 2019-06-10 19:48:15 · 173 阅读 · 0 评论 -
图论专题 - 解题报告 - C
首先这是明确的是一个打印有向图欧拉通路路径的题目,现在我们知道欧拉通路的成立需要些什么条件:图连通每个点的入度等于出度或有两个点入度不等于出度,且一个点出度比入度大一(起点),另一个点入度比出度小一(终点)如下图只能从中间一点开始到中间另一点结束,并且起点出度比入度大一推论:当有向图D,除了出度,入度之差为1,-1的两个节点之外,其余顶点的出度与入度相等时,D的有向欧拉通路必以出度...原创 2019-06-10 19:50:32 · 196 阅读 · 0 评论 -
图论专题 - 解题报告 - O
题意:空间中内有n个点,连n-1条边,使得这些边的高度差之和比上水平距离之和最小。先来看一下普通的最小生成树(n点m边),其选边规则:x1∗a1+x2∗a2+x3∗a3+...+xm−1∗am−1+xm∗amx_1*a_1 + x_2 * a_2 + x_3 * a_3 + ... + x_{m-1} * a_{m-1} + x_m * a_mx1∗a1+x2∗a2+x3∗a3+....原创 2019-06-10 19:59:53 · 179 阅读 · 0 评论 -
图论专题 - 解题报告 - N
想起来我觉得这题算是过题数人少里的原创 2019-06-10 19:59:29 · 159 阅读 · 0 评论 -
图论专题 - 解题报告 - M
一开始写拓扑排序一不小心就写挂了,后来知道差分约束就是专门来解决这种不等式问题,所以学了下新技巧,蛮好用。总的来说就是若A < B,则认为A 到B间有一条长度为1的有向边来表示深度差,若A == B,那么这条有向边不能传达深度差,让它的长度为0,我们能知道AB之间的深度的关系,但是具体的深度差是多少呢?我们来想,具体的深度差由什么决定呢?是不是由A到B的全部通路中最长的一条(中间点数最多的...原创 2019-06-10 19:59:00 · 157 阅读 · 0 评论 -
图论专题 - 解题报告 - L
首先想,这里有一堆物品,你可以选择取用或者不取,每种有一定的收益,支付一定的代价,那么就决定是你了!背包!(抱歉不是dp,OJ会等你枚举个2n 次?)权衡奖金与代价,这两者是有我没他的,怎么去处理呢?我们先建立一张图,所有的亲戚要求与源点相连,容量为其收获(压岁钱);所有的购买物与汇点相连,容量为其价格。所有要求与购买物相连,容量无限大(一定能买到)。这个时候跑最小割,必定会割掉连接源点或者...原创 2019-06-10 19:57:15 · 115 阅读 · 0 评论 -
图论专题 - 解题报告 - K
首先,做题的一个技巧就是观察数据范围奇特的地方。这道题的k只有20,n也比一般的图的10w级别要小,也许就是要在这里做文章。一般来说突然出现的小数据k,就是让我们巧妙地将一个算法复杂度扩大k倍的常数就能做的情况。分层图求最短路问题!这个类图建立的思路很棒,就是把原图复制k份,形成一个三维的图形,同一层点之间的边权就是原图中的边权,相邻两层的点之间的边权都是零(脑子里一旦有了这个图的大致形...原创 2019-06-10 19:56:40 · 139 阅读 · 0 评论 -
图论专题 - 解题报告 - G
没啥好说的,排序后贪心,并查集判定连通,达成数量条件就可以输出。#include<bits/stdc++.h>#define FOR(a, b, c) for(int a=b; a<=c; a++)#define maxn 500005#define maxm 55#define hrdg 10007#define zh 16711680#define inf 21...原创 2019-06-10 19:53:41 · 286 阅读 · 0 评论 -
图论专题 - 解题报告 - J
题意:给你一个二分图,选出最少的点使得覆盖的边数最多。查阅过之后发现这就是常说的二分图中最小点覆盖问题,而最小点覆盖问题是可以转化为二分图最大匹配问题的,详见 二分图最大匹配的König定理及其证明二分图最大匹配:对于二分图G的一个子图M,若M为其边数最多的子图,则称M为G的最大匹配。那么问题来了,二分图最大匹配如何求呢,自然匈牙利算法是常用解法,但是复杂度O(n3)O(n^3)O(n3)...原创 2019-06-10 19:55:22 · 142 阅读 · 0 评论 -
图论专题 - 解题报告 - I
第K短路首先可以想到在BFS中,从起点开始走,把每个点放入队列中时,以当前走过的距离加上当前点到终点的最短距离的和(即我们假设可以预知走哪个点到终点的距离最短)作为比较条件从小到大排序,当第一个到达终点时,走过的路径长度即为最短路,那么第k次到达终点的长度显然就是k短路。那么接下来就是问题的核心了,如何判断哪个点到终点的距离最短呢?我们需要一个排序条件,可以保证每次都优先走最有希望到达终点的点...原创 2019-06-10 19:54:51 · 136 阅读 · 0 评论 -
图论专题 - 解题报告 - H
首先整个题就透露着那么几个字:网络流板子。但是不会咋整啊,学呗。这里整理了一下网络流的求法知识啥的。这里引用一下别人博客的内容,这一篇是找到的比较好的了:增广路:找到一条从源点到汇点的路径,使得路径上任意一条边的残量>0(注意是小于而不是小于等于,这意味着这条边还可以分配流量),这条路径便称为增广路找到这条路径上最小的F[u][v](我们设F[u][v]表示u->v这条边...原创 2019-06-10 19:54:14 · 188 阅读 · 0 评论 -
动态规划专题 - 解题报告 - I
我们发现如果把攻略每位女主角需要的魅力值大小从大到小排过序后,选择较大的一个后再选其他的女主角就不需要计算在魅力值上的氪金了,只用考虑花费和收益,意思是这样预处理后就变成了一个板板的01背包?但是复杂度变成了n3 ?这是每一次先枚举最后一位的之后的计算,但是和滚动数组优化一样,都是逆序倒推,那么有没有可能优化呢?我们用滚动数组优化的是空间复杂度,意思是一般的背包只需要一维数组,但是我们看数据的...原创 2019-05-25 23:12:34 · 173 阅读 · 0 评论 -
数据结构专题 - 解题报告 - G
推出公式就能做,讲过题基本上难度也瞬间降低了一个等级。不过对于我这个初学者来说写起来还是很费劲(线段树教做人)。处理操作1时需要找到第一个大于t[i]+x的位置,然后区间推平,更新成t[i]+x的大小。由于区间内都是小于该值的,所以等于是在维护t[i]的区间最大值。值得一提的是,我们更新后t[ ]会一直处于有序递增的状态。所以也就满足了二分查找的条件。找到给定值的位置的复杂度也降低了。操作2...原创 2019-05-12 17:29:29 · 137 阅读 · 0 评论 -
数据结构专题 - 解题报告 - A
手推公式将其转化为:n∑i=1nx2−(∑i=1nx)2n\sum_{i=1}^nx^2-(\sum_{i=1}^nx)^2n∑i=1nx2−(∑i=1nx)2既然两边都变成了区间求和的形式,就可以用两棵线段树来维护,一个是x2 另一个是x的区间和。x的区间和修改很简单是板子操作,而x2 得好好谈谈了。在每个点上乘上k并加上b的,使x2 变成 ( k*x + b )2,公式化就是∑i=...原创 2019-05-12 17:27:04 · 168 阅读 · 0 评论 -
数据结构专题 - 解题报告 - N
很板的题,我建了三棵树,分别维护区间和最大值最小值,当然更简洁的写法是结构体一次挂三个属性。不过也没差其实。要注意的是,查询时初始化最小值最大值要用llinf,之前定义的inf是不够的,详见我的宏定义。话说这两个还是之前偷看zh的cf上的代码学来的(斜眼笑)……#include<bits/stdc++.h>#define maxn 10000005#define maxm 2...原创 2019-05-12 17:31:16 · 113 阅读 · 0 评论 -
数据结构专题 - 解题报告 - O
按位异或,将数字转化为二进制数字,按位比较,如果不相等则为1,相等则为0。做法是建立一颗01trie,在字典树上贪心查找,从高位到地位,最大值是有不同的位就选不同的数字,最小值则是在同一位上尽可能选择相同的数字。插入:化为二进制表示就是从最高位向下排列,依次搭入主树干,如果有出现过的节点,就在数该节点出现次数cnt[now]++,之后也方便删除操作。在树枝末端存下该树枝表示的数字,查询方便调用。...原创 2019-05-12 17:31:30 · 103 阅读 · 0 评论 -
数据机构专题 - 解题报告 - D
这题的诀窍在于我们需要找到区间内最大值的同时保证剩下的元素能被选全,保证m位密码能被填满,区间最大值可以用线段树维护,这就需要我们维护每次选择的区间,每一次选择的区间左端点一定要在上一次选择出来的元素右方开始,右端点与选择的次数有关,第一次在第n-m+1位,每一次右端点++即可保证剩余元素能被选择最终填满m位。我构造了一个映射ys[x][k],来表示数字x的第k次出现的位置,用数组cnt[ ]辅...原创 2019-05-12 17:28:09 · 108 阅读 · 0 评论 -
数据结构专题 - 解题报告 - J
原题洛谷P1484种树,又捡到一题做过的,lucky。所谓用堆来解决问题,从来就是一个词,贪心,堆的使用是否成功取决于你贪心的策略,而贪心一般来说处理起全局最优是有难度的,本题引入了一个小有名气的进阶贪心策略,反悔贪心。通过读题,我们发现贪心有一个尴尬之处在于,你如果选择了此刻的最大值i,那么在选择两个的条件下,你只能选择a[j]+a[i] (j !=i-1 && j != ...原创 2019-05-12 17:30:21 · 219 阅读 · 0 评论 -
数据结构专题 - 解题报告 - K
这题一开始我看到,反应的是用差分求关系,然后挨个推,但是发现这个做法有很多逻辑上的漏洞填不起来,虽然能过前7个点(捂脸笑),在这种错误的想法中做了各种优化的尝试,后来才意识到!原来是考并查集啊……但是我原本的想法出发点其实没错,我们知道区间 [l, r] 的区间和为奇数或者偶数,用前缀和差分来考虑就是 sum[r] - sum[l-1] ,l-1和r间的差值为奇数或者偶数。我们可以这么想,如果差...原创 2019-05-12 17:30:35 · 146 阅读 · 0 评论 -
数据结构专题 - 解题报告 - I
平衡树做法,因为最近正好自己看了点平衡树相关的知识,便觉得这个题就是专门为了平衡树准备的。(完全没想到set,其实也是不会用)因为查排名,如果我们有一棵二叉搜索树那就很好办,上面每个点都有相应的判断位置的值,从根节点入手,如果当前节点比过题数较多就往左儿子查,过题少就往右儿子查,相等就是判断罚分然后向左或者向右儿子搜索。一旦发现与当前节点过题数和罚分都相等的节点就返回左方所有节点囊括的点数,在那...原创 2019-05-12 17:30:06 · 187 阅读 · 0 评论 -
数据结构专题 - 解题报告 - M
首先感谢dalao前辈提供思路,整理如下:读入数据并前向星建图以1为根节点dfs走图建树,并标记已经走过(布尔型vis[ ]数组判断),以防走回父节点,然后深度(depth[ ])逐级+1,且dis[to]=depth[to](因为现在的最短距离是到根节点1的距离,即深度),然后搜下一个点。建图完毕后倍增初始化。m次循环,输入操作类型和操作点,如果是染色,那么红色总点数++,为当前点,如...原创 2019-05-12 17:31:02 · 158 阅读 · 0 评论 -
数据结构专题 - 解题报告 - C
正解是教我们学习set的运用,但是这里想介绍一下我憨憨的线段树做法,同样是O(nlogn)的复杂度,只是常数比set做法大不少,标程21ms,我的时间为175ms,大概是八九倍的常数(有点鸡肋看起来)。对了因为数字最大值能到1e9,线段树开不下,但是因为我们不需要线段的具体大小只要知道他们每个点的相对位置就行,所以可以离散化方便建树。这题就是判断是否生成新线段,以及合并其他线段两个操作。判断...原创 2019-05-12 17:27:49 · 127 阅读 · 0 评论 -
数据结构专题 - 解题报告 - H
单调队列的板子题,维护好队首队尾,然后一路找最值过去。维护的操作注释写在代码里了int n, m;ll sum[maxn], x, ans=-inf;int q[maxn]; //q[]是队伍位置(下标)int head=0, tail=1;int main(){ n = read(); m = read(); FOR(i, 1, n) ...原创 2019-05-12 17:29:49 · 118 阅读 · 0 评论 -
数据结构专题 - 解题报告 - B
这是我这个专题做出来的第一道题,跟榜看到的B,读完题,惊了惊了!似李!货车运输!当时也不说忙着抢一血,反正就是把自己写过的代码直接粘来改改交了过了。但这样做的意义仅仅是多一个过题数而已,还是得好好整理一下。分析完题意后,我们知道我们需要一个最大生成树保证带宽尽可能大,因为我们不会去选择更低带宽的路,然后在一条路上找到带宽最小值。就可以搜图并记录边权最小值即可。但是这么暴力去搜基本上是必T的。我...原创 2019-05-12 17:27:18 · 115 阅读 · 0 评论 -
数据结构专题 - 解题报告 - F
我一开始是直接把E的代码改改就交的一发过,在线分块做法,286ms的速度很优秀,后来讲题时遇到新的算法——莫队,这题本来是专门为离线做法准备的,虽然看起来并没有卡在线做法,但还是得学一下。先谈谈我对莫对算法的理解吧,都说莫队是一种优雅的暴力,用于求解区间内问题,因为区间在不停变换,我们如果用两个指针维护我们需要查询的区间(l 和 r),有以下三种情况。无序,让l和r乱跳,时间O(n^2q)爆...原创 2019-05-12 17:29:13 · 149 阅读 · 0 评论 -
数据结构专题 - 解题报告 - 目录
A - 方差 - 解题报告线段树区间内乘法加法和推平B - 吞吐量 - 解题报告倍增LCAC - 人在地上走,锅从天上来 - 解题报告set的用法,不过我只用线段树过了D - 密码 - 解题报告维护区间的RMQ问题,也可以看作栈E - 冬马和纱天下第一 - 解题报告在线分块F - 我永远喜欢冬马和纱 - 解题报告莫队G - 线段树教做人 - 解题报告线段树+数学公式推导...原创 2019-05-10 01:51:45 · 142 阅读 · 0 评论 -
动态规划专题 - 解题报告 - H
eom选择的时候:dp[i]=make_pair(dp[j].first+a[i],dp[j].second)j为节点i的儿子中dp[j].first尽可能大并在此基础上dp[j].second尽可能小的儿子编号。moe选择的时候:dp[i]=make_pair(dp[k].first,dp[k].second+a[i])k为节点i的儿子中dp[k].first尽可能小并在此基础上dp[...原创 2019-05-25 23:11:36 · 175 阅读 · 0 评论 -
动态规划专题 - 解题报告 - M
别的我不说了,良心题解先吹一波好吧。最重要的使这一段假如第一位4,第二位7,三四位就可以随便取了。设这种状态为(2,2),意思为前两位已经匹配上了4750的第二位。则用dp[2][2]表示(dp[100010][5],一共5*1e5种状态)。那么(2,2)就有10种选择(0~9):·会转移1次到(3,3)(选5);·1次(3,1)(选4);·8次(3,0)(选其他)在一番推导后,...原创 2019-05-25 23:19:20 · 307 阅读 · 0 评论 -
动态规划专题 - 解题报告 - G
第i位之前,以i位结尾的子串,与第(i-1)位一起考虑的话,会有这样的规律,i-1位上的子串的数量乘以10+第i位的数字,就是当前串的大小,但是我们需要的不是大小,而是能否整除数字k,其实就更方便了,因为i-1上的数字取模后不影响乘积求和再取模,我们知道每一次的取模都会对后面的状态转移有影响,而且每次取模后结果都可以控制在k内,我们其实可以把每一次取模后结果为t的数量记下来,我们最后求的是t==0...原创 2019-05-25 23:09:56 · 129 阅读 · 0 评论 -
动态规划专题 - 解题报告 - E
dp[i][j]表示第i块中第j位结尾的最小值。初始化并读入字符串。处理第一个板块,数出现了几个字母,第一块中对于任何j都有dp[1][j] = cnt。然后处理后面的板块,枚举块数,从2到len/k,每一个板块内,数出出现字母种类数,并开始枚举第i块的第j位(使以j位为板块结束),内嵌套枚举i-1块的第p位,只要p位在i段出现过,且i段只有这一种字母或者i段最后一个字母不是p位字母,那么就...原创 2019-05-25 23:07:02 · 89 阅读 · 0 评论 -
动态规划专题 - 解题报告 - F
首先我们要找如何让状态转移,前提就是需要知道那些状态能干掉j用压缩后的状态来表示当前的武器,如果i的状态(初始为weapon[0])可以杀死敌人j,那么就可以升级武器weapon[i],weapon[i] |= change[j],所以武器i的下一轮的武器k的状态就是更新后的weapo[i]。dp就是如果当前武器i无法杀死敌人j,但是武器升级后weapon[i]可以直接杀死,因为i到weapo...原创 2019-05-25 23:08:29 · 117 阅读 · 0 评论 -
动态规划专题 - 解题报告 - 目录
A - oy环游世界 - 解题报告状态压缩dp入门题B - 挖矿攻略 - 解题报告棋盘dp问题,是需要自己画出图来想通了就简单的那种C - 手办 - 解题报告四维状压dp,原型:help bubuD - 序列 - 解题报告最长上升路径nlogn做法E - 神 - 解题报告F - 苇名欧一郎 - 解题报告状压dp,预处理和状态转移的设计G - 子串 - 解题报告状态设计出后就...原创 2019-05-25 23:21:39 · 212 阅读 · 0 评论 -
动态规划专题 - 解题报告 - K
首先想到靠一次抽中和靠收集碎片得到角色得分开计算。n次里靠一次抽中的概率为:ans1=1−(1−x)nans1 =1-(1-x)^nans1=1−(1−x)n而靠收集碎片则需要一个递推公式,我们令dp[ i ][ j ]为抽i次抽到j种碎片的概率,是由以下两种情况转移而来的i-1次抽奖时已经抽到了j种碎片dp[i - 1][j],那么再抽一次,要么什么都抽不到,要么出的碎片还是之前出现过的...原创 2019-05-25 23:16:26 · 135 阅读 · 0 评论 -
动态规划专题 - 解题报告 - L
转移方程:dp[i]=min(dp[i],dp[j]+(x−L)2),0<=j<=i−1dp[i]=min(dp[i],dp[j]+(x-L)^2) , 0<=j<=i-1dp[i]=min(dp[i],dp[j]+(x−L)2),0<=j<=i−1但是如果只是单纯的n2 爆破大概率超时,(但就是有爆破神仙过了),这里的优化想法...原创 2019-05-25 23:18:19 · 107 阅读 · 0 评论 -
动态规划专题 - 解题报告 - B
首先在从一个点,目标是向西运输,那么它一路走过的路径x中可能朝西也可能朝北,但最终指向的都是西边,画图可知西方同行中所有的矿点必只能向西运输,即使是从出发就开始一路向北,最终也只能汇流进路径x中,指向西。从该点向北的运输,北方同列的考虑也是一样的。我们可以预处理出从一个点向西和向北的贡献是什么。我们令dp[i][j]为前i行j列的矿石采集总数,在点(i, j)有这么一堆矿石,我们只能二选一将其向...原创 2019-05-25 23:00:47 · 151 阅读 · 0 评论 -
动态规划专题 - 解题报告 - A
一个经典的货郎担问题,加上17的范围限制各种明示状态压缩,用二进制来表示走过哪几个城市,我们可以开一个二维数组dp[i][j],表示走过了i的城市,最后在j城市停留的距离。预处理一遍每个城市间的距离,算出dis[i][j],到dp[i][j]的状态可以由[1 ^ (1 << j)][k]转移过来,比较距离保存最优值就行,然后就有转移方程:dp[i][j] = min(dp[i][j]...原创 2019-05-25 22:59:32 · 147 阅读 · 0 评论