
基础算法
文章平均质量分 78
会飞的小蛇
这个作者很懒,什么都没留下…
展开
-
Johnson全源最短路
Johnson全源最短路思路:对于NNN个顶点MMM条边的图怎么求全源最短路?Floyd,时间复杂度O(N3)O(N^3)O(N3)。NNN次Bellman-Ford/SPFA,以每个顶点为源点跑一遍,时间复杂度O(N2M)O(N^2M)O(N2M),在稠密图中比Floyd还慢,即使尝试一些如SLF的玄学优化也会被特定数据卡掉。NNN次Dijkstra,时间复杂度O(NMlogM)O(NM\log M)O(NMlogM),弊端是无法处理负边权。那么是不是可以考虑把所有边权变非负?考虑如果原创 2020-09-03 17:20:30 · 334 阅读 · 0 评论 -
(单调队列)洛谷P2629好消息,坏消息
洛谷P2629好消息,坏消息思路:题目可以选一个kkk,然后按照k∼n,1∼k−1k\sim n,1\sim k-1k∼n,1∼k−1,暴力枚举的话是O(n2)O(n^2)O(n2)。我们可以把这个像环一样的东西拆开,即an+i=ai,i∈[1,n]a_{n+i}=a_i,i\in[1,n]an+i=ai,i∈[1,n],将数组变成2n2n2n的长度,然后判断长度为nnn的每段是否符合要求。即计算满足∀∑i=jkai≥0,k∈[j,j+n−1]\forall\sum_{i=j}^{k}a_i\ge原创 2020-08-27 13:58:56 · 287 阅读 · 0 评论 -
(单调队列)洛谷P1714切蛋糕
洛谷P1714切蛋糕思路:题意即给一个长度为NNN的数组a1,a2,⋯ ,aNa_1,a_2,\cdots,a_Na1,a2,⋯,aN,求max{∑i=lrai∣r−l+1≤M}\max\{\sum_{i=l}^{r}a_i|r-l+1\le M\}max{∑i=lrai∣r−l+1≤M}。可以转换成sumi=∑i=1raisum_i=\sum_{i=1}^{r}a_isumi=∑i=1rai,求max{sumi−sumj∣i−j+1≤M}\max\{sum_i-sum_j|i-j原创 2020-08-27 13:22:32 · 319 阅读 · 0 评论 -
(尺取,单调队列)牛客I名家之壁
牛客I名家之壁思路:先看数据范围,只能用O(n)O(n)O(n)的写法去写,那么就用单调队列去维护最大最小值。那么接下来就是怎么解决寻找区间[l,r][l,r][l,r]的问题了。我们不妨固定lll,右移rrr,可以发现,最大值不可能减小,最小值也不可能增大,也就是最大值和最小值的差值是非递减的。也就是如果有一点rrr满足maxl≤i≤ra[i]−minl≤i≤ra[i]>m\begin{aligned}\max\limits_{l\le i\le r}a[i]-\min\limits_{l原创 2020-08-27 10:54:03 · 139 阅读 · 0 评论 -
(矩阵快速幂)牛客221C公式题(2)
牛客221C公式题(2)思路:矩阵快速幂最难的就在推公式。首先看f(n)=2*f(n-1)+3*f(n-2)+n;先可以得到到如下矩阵:2 3 1 0 f(n-1) 2*f(n-1)+3*f(n-2)+n f(n)1 0 0 0 × f(n-2) = f(n-1) = f(n-1)0 0 1 1 n ...原创 2020-02-04 12:45:26 · 270 阅读 · 0 评论 -
(矩阵快速幂)POJ3070Fibonacci
POJ3070Fibonacci题意&思路:求斐波那契数列的第n项fn%10000。矩阵快速幂模板题,题目已经告诉你了矩阵怎么求。代码:#include<iostream>#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<string.h>...原创 2020-02-04 11:32:09 · 141 阅读 · 0 评论 -
(枚举+状压)POJ3279Fliptile
POJ3279Fliptile题意&思路:有一个m*n的01矩阵,每次选一个格子会翻转这个格子和他的上下左右。问是否能将所有的格子变成0,能就输出翻转次数最小的方案(有多个即输出字典序最小的),0表示不反转,1表示翻转。如果没有输出“IMPOSSIBLE"。这是kuangbin的搜索题单里的一道题,之前一直没有思路。看了其他人的题解,其实就是枚举状态,然后可以发现如果(i-1,j)点...原创 2020-02-03 20:16:42 · 173 阅读 · 1 评论 -
(搜索)洛谷P1037产生数
洛谷P1037产生数思路:我们很容易看出结果是每个位数能变化的次数(包括他自身)的乘积。然后我就用bfs找每个位数能变化几次,TLE了。对于dfs并不擅长,看来其他的题解,发现floyd也可以解决问题。floyd可以理解为i是否能通过转换到k之后转换到j。最后发现答案最大时1030,肯定会超long long。写一个高精度乘低精度就能行了。代码:#include<bits/st...原创 2020-02-02 11:05:21 · 227 阅读 · 0 评论 -
(数学)洛谷P1062 数列
洛谷P1062 数列思路:挺有意思的一个题目。刚开始的想法是枚举ki,然后把ki和数列前面的数相加。但是后来注意到每个数列的序号的二进制,可以发现:1349101213303130+313230+3231+3230+31+3211011100101110111数列的值就是数列编号的二进制数位i的值*ki-1。代码:#inc...原创 2020-02-01 20:22:04 · 377 阅读 · 0 评论 -
(dp)洛谷P1108低价购买
洛谷P1108低价购买思路:看起来是最长下降子序列,但要考虑方案数,这里卡了好久。方案数也像一个dp,由dp的状态来决定方案的状态。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long long#define cl(x,y) memset(x,y,sizeof(x))#defin...原创 2020-02-01 11:23:48 · 182 阅读 · 0 评论 -
(dp)洛谷P1095守望者的逃离
洛谷P1095守望者的逃离思路:dp[i]表示在第i秒最远走多远,跑步和闪烁分开进行。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long long#define cl(x,y) memset(x,y,sizeof(x))#define ct cerr<<"Time ...原创 2020-01-31 20:38:28 · 164 阅读 · 0 评论 -
(dp)洛谷P1736创意吃鱼法
洛谷P1736创意吃鱼法思路:他要求一个矩阵只能并且必须在对角线上有1才能被吃掉。如下:1 0 00 1 00 0 1我们用dp[i][j]表示这点满足矩阵的最大值。那么看下图:1 0 0 00 1 0 10 0 1 00 0 0 1可以看出dp[3][3]=3,那怎么求dp[4][4]=2。他显然不是dp[3][3]+1=4≠2。我们观察可以发现,他是被(2,4)的...原创 2020-01-31 18:36:21 · 191 阅读 · 0 评论 -
(bfs)洛谷P1363幻象迷宫
洛谷P1363幻象迷宫思路:刚开始,我的思路是能够再次找到S点,就能无限走下去。然而看反例:5 5######...##.#S##...######很显然,这不能走出去。5 5#####..#..#S#.#..#..#####与第一个样例相似。那么又想到走到的不是本来的S,而是其他图的S。然后就想是不是两层就可以了,他本身是在第一层,然后到边上后就到了第二层...原创 2020-01-30 22:34:59 · 249 阅读 · 0 评论 -
(字符串hash)AcWing841 字符串哈希
AcWing841 字符串哈希代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long long#define ull unsigned long long#define cl(x) memset(x,0,sizeof(x))const int N=1e5+3;const int P...原创 2020-01-28 21:18:17 · 203 阅读 · 0 评论 -
(hash)ACwing840模拟散列表
ACwing840模拟散列表拉链法:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long long#define cl(x) memset(x,0,sizeof(x))const int N=1e5+3;const int mod=1e7+9;const int maxn=0x3f3f...原创 2020-01-28 16:36:20 · 168 阅读 · 0 评论 -
(背包)AtCoder153E-Crested Ibis vs Monster
AtCoder153E-Crested Ibis vs Monster思路:两天没写代码真的状态好差。完全背包。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long long#define cl(x) memset(x,0,sizeof(x))const int N=1e5+1...原创 2020-01-27 20:21:23 · 469 阅读 · 0 评论 -
(BFS+状压)AcWing1131拯救大兵瑞恩
AcWing1131拯救大兵瑞恩思路:先想到是用一个结构体存一个格子四周的情况和钥匙的情况,然后每次遇到门的时候要把自己有的钥匙和需要的比较。但后来想到钥匙最多只有十个,所以可以用状态压缩,每个点的钥匙和自己的钥匙可以用二进制数表示,拿钥匙就用按位或;遇到门就用按位与判断。然后我又用结构体记录一个点四周是否有墙,结果愉快的MLE了。后来把数据自己测的时候发现跑不出结果。在后面的一个小时内,我...原创 2020-01-21 21:31:17 · 321 阅读 · 1 评论 -
(并查集)洛谷P1197 [JSOI2008]星球大战
P1197 [JSOI2008]星球大战思路:摧毁是这个题目的一个难点,如果是摧毁一个点就重新构图的话肯定会T。那么我们可以反着想,就是从最后的状态往前推,用并查集判断是否是连通块。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long longconst int N=1e6+10;...原创 2020-01-20 20:04:42 · 256 阅读 · 0 评论 -
(SPFA的SLF优化)AcWing342道路与航线
AcWing342道路与航线思路:看起来非常裸的spfa,然而精心构造的数据卡了。就用到spfa的SLF优化,我们之前的spfa都是用队列实现的,每个数据都放到队尾。现在我们用双端队列,如果当前点的权值少于我们当前队头点的权值的话,那么我们就将这个节点插入到队头,否则我们插入到队尾。代码:#include<bits/stdc++.h>#define pii pair<...原创 2020-01-20 18:02:50 · 407 阅读 · 0 评论 -
(dp) 牛客小白月赛21I I love you
牛客小白月赛21I I love you思路:dp。dp[i]=(dp[i]+(s==‘x’)*dp[i-1])%mod。x为当前位置上要求的字母。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long longconst int N=1e6+10;const int mod=2...原创 2020-01-19 08:33:33 · 303 阅读 · 0 评论 -
(贪心)洛谷P1233木棍加工
洛谷P1233木棍加工思路:排序,l,w按照从大到小排列。然后递归寻找。(据说也可以用dp做)。代码:#include<bits/stdc++.h>const int N=1e4+10;const int mod=1e7+9;const int maxn=0x3f3f3f3f;const int minn=0xc0c0c0c0;const int inf=999999...原创 2020-01-18 17:04:35 · 248 阅读 · 0 评论 -
(贪心)洛谷P1031均分纸牌
洛谷P1031均分纸牌思路:离散化没怎么学,题库a不动了,写点思维题放松下。求平均数,算差值。差值为0就不用动他,其他的转嫁给下一堆。代码:#include<bits/stdc++.h>const int N=1e4+10;const int mod=1e7+9;const int maxn=0x3f3f3f3f;const int minn=0xc0c0c0c0;...原创 2020-01-18 16:48:18 · 225 阅读 · 0 评论 -
(贪心+并查集)POJ1456 Supermarket
POJ1456 Supermarket题意&思路:给你n个商品的价值(pi)和保质期(必须在第di天之前卖掉)。一天只能卖一个商品,问可以获得的最大利润。首先是贪心,价值越大的物品越要尽可能的卖出去。就是按找商品的价值排序。然后售卖的时间可以用并查集来维护(大佬真的tql,并查集还可以这么用)。先开始给fa数组赋值-1,当fa[i]==-1的时候表示这一天还没有买过。fa[t]==...原创 2020-01-18 15:26:49 · 187 阅读 · 0 评论 -
(概率dp)洛谷P2095 [JLOI2013]卡牌游戏
洛谷P2095 [JLOI2013]卡牌游戏思路:dp果然是玄学。一开始想顺推,但是因为会有人出局,所以顺推会变得很复杂。看了大佬的题解,才发现逆推的妙处。用dp[i][j]表示i个人组成的环进行游戏,第j个人胜出的概率,那么dp[1][1]一定是1。我们可以想到dp[i][j]的状态肯定是由上一层的状态得出,就是i个人进行游戏后还剩下i-1个人,而i个人所得的概率可以由i-1的状态推出...原创 2020-01-18 14:49:41 · 325 阅读 · 1 评论 -
(带权并查集+dp)POJ1417 True Liars
POJ1417 True Liars题意&思路:一个写了三天的题。一个岛上存在p1个好人和p2个坏人。Akira可以询问n个问题,每个问题由两个编号x,y和一个字符串a(yes或者no)组成。好人会说实话,坏人会说假话。每次询问表示x如果想让你认为y是好人就会回答yes。问是否能够得到好人的编号。加权并查集+dp。加权并查集并不难想,我们不难发现回答yes的是同类,no的是异类。...原创 2020-01-17 23:29:43 · 212 阅读 · 0 评论 -
(带权并查集)POJ1182 食物链
POJ1182 食物链思路:因为题目给的相对关系,所以可以用带权并查集做。权值:0表示x和y是同类,1表示x吃y,2表示x被y吃。那么在路径压缩的时候,我们得到w[a->c]=(w[a->b]+w[b->c])%3。在区间合并的时候w[t1]=(-w[x]+w[y]+w-1)%3。在判断关系的时候比较w-1和(w[x]-w[y]+3)%3,+3是为了避免负数,w-1是因为...原创 2020-01-16 22:50:05 · 154 阅读 · 0 评论 -
(带权并查集)hihoCoder1515分数调查
hihoCoder1515分数调查思路:模板题。权值为子节点比父节点多的分数。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long longconst int N=1e5+10;const int mod=1e7+9;const int maxn=0x3f3f3f3f;con...原创 2020-01-16 20:51:59 · 219 阅读 · 0 评论 -
(带权并查集)HDU3038How Many Answers Are Wrong
HDU3038How Many Answers Are Wrong题意&思路:给一个区间长度n,和子区间个数m。区间[l,r]的和为v。如果一个子区间和与前面的子区间和冲突,及为错误,问错误的总数。我以前竟然学过带权并查集?第一道带权并查集的题,看着题解写的。好复杂的东西。带权并查集就是结点间有边权值的并查集。每个结点记录的是与根节点的权值,在路径压缩的之前,sum记录的是与其父...原创 2020-01-16 20:36:59 · 188 阅读 · 0 评论 -
(贪心)CF1136D Nastya Is Buying Lunch
CF1136D Nastya Is Buying Lunch题意&思路:有n个人排队,编号为a[i]的排在第i为,Nastya排在最后一位。给你一些可以交换的编号(x,y),当且仅当x排在y前面并且相邻的时候才可以交换位置。问Nastya最多向前移动多少位。真的好菜,刚开始还看错题了,以为不相邻也能交换,纠结了很长时间。之后知道是贪心,却只有一点模糊的思路,又纠结了几个小时。然后看了...原创 2020-01-13 21:03:25 · 249 阅读 · 0 评论 -
(状压dp)AcWing1243 糖果
AcWing1243 糖果思路:状压dp。每组糖果用二进制数表示,0表示有,1表示没。预处理一下。dp[j|a[i]]=min(dp[j|a[i]],dp[j]+a[i])。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long longconst int N=1e6+10;con...原创 2020-01-12 20:14:39 · 224 阅读 · 0 评论 -
(状压dp)洛谷P1879玉米田
洛谷P1879玉米田思路:第一次自己把状压dp写出来,有点激动。dp[i][j]表示在第i层的状态j。在预处理的时候判断下每层的合法情况。设第一层可选的状态都是1。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long longconst int N=1e6+10;const ...原创 2020-01-12 15:50:30 · 194 阅读 · 0 评论 -
(状压dp)洛谷P1896互不侵犯
洛谷P1896互不侵犯思路:DP好难,状压DP好难。状压dp就是把状态压缩成一个数,以节省空间。例如这题,国王在一行中要么放要么不放,那我们令放为1,不放为0,就可以组成一个01串,我们把这01串看成一个二进制数的话,就可以将这个状态表示成一个数。因为涉及到二进制,所以状态dp中采用很多位运算。对于题目要求国王四周都不能有其他的国王。在同一行时,我们可以用((s>>1)&a...原创 2020-01-12 10:47:29 · 223 阅读 · 0 评论 -
(数位dp)HDU3652B-number
HDU3652 B-number题意&思路:找出1~n中含有13并能被13整除的数字个数。纠结了好久,状态真的是差。dp[len][p13][mod]三个参数分别表示数位长度;p13的0表示上一位不是1,1表示上一位是1,2表示存在13;mod表示这个数和13的余数。剩下的就是数位dp的板子了,我太菜了啊。代码:#include<bits/stdc++.h>#d...原创 2020-01-11 20:25:44 · 244 阅读 · 0 评论 -
(数位dp)HDU4734 F(x)
HDU4734 F(x)题意&思路:f(x)的定义是,对于十进制数的每位(anan-1……a1),f(a)=an*2n-1+an-1*2n-2+……+a1*20。给你a和b,求在f(x)<=f(a),x∈[0,b]的个数。又是数位dp,依旧没有思路。看了大佬的思路,惊为天人。用dp[i][j]表示第i位,j是后面要凑的权值和。需要的f(a)和你现在的总权值的差值,就是你在接...原创 2020-01-09 15:46:03 · 221 阅读 · 0 评论 -
(数位dp)POJ3252 Round Numbers
POJ3252 Round Numbers题意&思路:规定在二进制数下,0的个数大于等于1的个数的数字为“round number”,给你一个区间,让你找“round number”。数位dp,太难了啊啊啊啊……dp[i][s0][s1]表示第i位的0数量和1数量。记录下前导0的情况。代码:#define ll long long#include<iostream>...原创 2020-01-09 14:25:40 · 174 阅读 · 0 评论 -
(区间dp)2017icpc北京 Pangu and Stones
2017icpc北京 Pangu and Stones题意&思路:给n个石头,每次只能合并连续的l~r块,合并的代价是每堆石子的权值和,问最小的代价是多少。看起来就是石子合并的进阶版(实际上也是),但是好难好难好难啊。看题解都看不懂,要感谢学长的讲解。记一下不太懂得部分:dp[i][j][k]是i~j区间划分为k堆得代价,如果l≤k≤r得话,就可以组成一堆,代价就是i~j所有石子...原创 2020-01-09 11:35:06 · 192 阅读 · 0 评论 -
(数位dp)HDU2098 不要62
HDU2098 不要62思路:对数位dp完全不懂一知半解,参考了大佬的代码才能勉强理解。dfs+记忆化。len记录数位,p6记录此位是不是6,limit记录是否达到数位上界。代码:#include<bits/stdc++.h>#define pii pair<int,int>#define ll long longconst int N=1e6+10;c...原创 2020-01-09 00:59:37 · 199 阅读 · 0 评论 -
(数位dp)HDU3555 Bomb
HDU3555 Bomb题意&思路:给个n,计算1~n中子串含有“49”的数。对于这种求一个区间内含有某种特征的数,一般用数位dp。数位dp就是数字的位上dp,例如这题给的范围是到263-1约等于1019,如果枚举遍历判断的话,肯定会T。如果是数位的话,就只要枚举19位的情况。听起来是不是感觉很简单 实在是太难了,看了好多大佬的题解和分析才懂了一点点。数位dp借助于dfs和记忆...原创 2020-01-08 23:35:09 · 201 阅读 · 0 评论 -
(BFS)POJ3126Prime Path
POJ3126Prime Path题意&思路:给两个数,又第一个数改变到第二个数的奇数路径最少是多少。每次只能改变一位,且不含前导0,每次改变后的数都要为奇数。先把素数筛出来,然后按位子改变bfs即可,第一位不能为0以及最后一位一定不可能是偶数。代码:#include<iostream>#include<stdio.h>#include<std...原创 2020-01-08 14:13:34 · 845 阅读 · 0 评论 -
(BFS)HDU1195Open the Lock
HDU1195Open the Lock题意&思路:给你两个4位的数字,对每位数字可以+1或者-1,1-1变成9,9+1变成1,相邻两位还可以交换位置,最少需要多少步可以把第一串数字改成第二串。求最少的距离,用bfs暴搜所有情况。看到还可以用双向bfs做,一会补。代码:#include<bits/stdc++.h>const int N=1e4+10;const...原创 2020-01-08 13:43:39 · 192 阅读 · 0 评论