自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 AC自动机相关专题

时隔一年,重新开始回归博客。最近被ac自动机折磨的死去活来,直到昨天做完了洛谷的二次加强版之后有所感悟,突然想写篇博客整理一下,本篇的题目来源于洛谷的ac自动机和其加强版以及二次加强版。首先介绍一下ac自动机是用来干什么的,它是关于求解一种关于多个字符串在一个字符串上匹配问题。它需要的基础是字典树和kmp算法。回忆一下kmp算法吧。俩个字符串相匹配,开始一个字母一个字母的匹配,如果可以匹配,则继续向后匹配,如若匹配不到,则模式串当前指针指向next[当前指针],这个next数组的作用就是加快匹配速度。而

2021-07-13 11:04:05 62

原创 习题日常第二十八练

1玩转二叉树(题目链接)二叉树的模板,一直没时间学,凑巧看到这道题,通过前序中序建树和通过后序中序建树。关于这个题,我们要先根据前序和中序建树,然后翻转,再输出即可。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#in

2020-10-13 20:30:26 73

原创 习题日常第二十七练

1旅行计划(题目链接)原来看过拓扑排序,但是当时真的不知道有什么用,今天被教育了。这个题可以直接用类似于spfa的算法进行计算,但是会超时。超时的情况就是当数据特别大时候,一个关键点连接好多点,但是这个点被多次更新,每跟新一次,就需要跟新这个点之后的所有点。而拓扑排序就可以很好的解决这个问题。每次我们可以确保关键点之后点跟新之前,它的前驱的所有最长距离已知。具体代码如下。#include<cmath>#include <iostream>#include<stdio

2020-09-04 23:32:56 83

原创 习题日常第二十六练

1全源最短路(题目链接)开学,考试耽误了一段时间,最近在做简单的题找手感。今天这个题也是最近比较正式的做的一个题,而且这个题是一个johnson的模板题,通过这个题我学会了如何用迪杰斯特拉算法求边权为负的最短路。不得不说johnson算法确实十分的巧妙,今天初学理解不深。它在原有点的基础上加一个虚点,初始化它到每个点的距离都是0,然后用spfa算法(可以优化,并同时判断是否有负环)求一下虚点到每个点的距离。到i点的距离记为h[i]。若每条边的起始点记为s,指向点记为t。这条边的距离加上h[s]-h[t],

2020-09-03 23:20:39 75

原创 习题日常第二十五练

1序列操作(题目链接)这个题是线段树的基础综合运用题。对于细节要求特别高,需要对每一个标记以及互相之间的关系相当清晰。大体的思路就是连续的0或者1只可能出现在左面或者最右面或者序列中间,用线段是进行维护即可。具体见代码。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#

2020-08-15 22:44:49 71

原创 习题日常第二十四练

1寻找道路(题目链接)这个题有点绕。我们可以通过从终点出发,将已知边反向,用bfs搜,找到可以直接到达终点的点。再通过对每个点遍历,若这个点不能到终点,则反向后的所有与它相连点都不能到。但是注意,此时删点有后效性,需要用两个数组完成。最后在所有合法点上再跑一遍迪杰斯特拉算法求最短路即可。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<str

2020-08-13 21:22:48 84

原创 习题日常第二十三练

1[BJWC2012]冻结(题目链接)这个题是一个多层图的模板题。注意多层图之间的每一层是有方向的,建图的时候需要特别注意。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#include<map>#inc

2020-08-12 13:59:39 78

原创 习题日常第二十二练

1集合中的质数(题目链接)这是一个容斥原理的题,通过枚举状态来实现。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#include<map>#include<cstring>#include

2020-08-10 19:12:41 135

原创 习题日常第二十一练

1圆与三角形(题目链接)这个题是个公式题。通过(A+B+C)/2=90度,可以得出sinA*r之前的恒等于1,只要A等于90度即可得出最大。主要考察三角函数的化简。 double r; scanf("%lf",&r); printf("%.2lf",r+1);2字符串(题目链接)这个题是个不错的思维题。看过题解以后发现非常的巧妙。把所求问题转化在坐标中,开始状态为(0,0),总共走n+m步,如果当前位置选1,坐标加(1,1),如果选0,坐标加(1,-1)。因为有n个1,所以

2020-08-08 14:19:55 93 1

原创 习题日常第二十练

1恋与程序员(题目链接)这个题一开始我以为是个最短路,但是老感觉怪怪的,后来发现它并不满足用最短路的条件,因为卡片重复用过后只算一次的价值。直接用dfs深搜,加一点点剪枝。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>

2020-08-06 15:46:07 112

原创 习题日常第十九练

1直角三棱锥(题目链接)题目本身没有难点,算个公式题吧。但是中间有一步操作是值得学习的,对于这个题最后的答案要除以6,但是数据规模必须边取余边计算。这时候,我们就可以将余数扩大这个需要除以的倍数,最后除。这个方法非常的巧妙,以往我们在解决问题的时候都会用到费马小定理来解决。具体代码如下。 cin>>n>>m; n++; ans=(((n*(n+2))%(m*6))*(n+1))%(m*6); ans/=6; cout<

2020-08-04 23:38:24 119 1

原创 习题日常第十八练

1道路铺设(题目链接)这个是思维题,代码特别简单。第一个数必定是要加入天数的,之后,每一个数只要大于它的前一个,天数就得加上他俩的差值,因为这时候前面那个小的需要的天数不足以让大以及以后的比这个大的消耗为0,此时先计算需要额外的大的数需要天数,然后再以此类推判断后面的数即可。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<stri

2020-08-03 22:13:25 95

原创 习题日常第十七练

1栗酱的数列(题目链接)这个题是一个kmp+差分的思维题。看过题解以后才写出来的,利用取余的运算规律,再用差分计算相邻之间差值对于k取余,最后用kmp算法来求出匹配连续序列的数量即可。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<se

2020-08-02 23:17:56 57

原创 习题日常第十六练

1麦森数(题目链接)这个题是个快速幂和高精度以及一点点数论的组合。我一开始发现根据高精度判断位数是不可能的,于是看了下别人的题解,可以通过log函数来计算位数。剩下的用高精度乘法加快速幂就解决了。代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include

2020-08-01 23:02:05 62

原创 习题日常第十五练

1最短路计数(题目链接)这个题是迪杰斯特拉算法的一个运用。每次拓展点的时候,拓展点的距离如果需要被更新,则它的方案数是更新它的点的方案数,如果更新点时候更新距离与现在距离相等,方案数字相加。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include&

2020-07-31 13:40:32 88

原创 习题日常第十四练

1乌龟跑步(题目链接)这个题是一个记忆化搜索的题,只要找清楚每次是否变换以及方向即可。用一个四维数组来记录是否走过。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#include<map>#inclu

2020-07-29 21:37:58 120 1

原创 习题日常第十三练

1递推(题目链接)这个题是个矩阵快速幂的典型题,主要难在如何找出矩阵递推关系。具体代码如下(矩阵一定要开long long )。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#include<map>#includ

2020-07-28 23:29:45 93 1

原创 习题日常第十二练

1Travel(题目链接)这个题具有迷惑性,传送的路只有很少,但是点有很多。对于起点到终点来说,只有走这些有传送路的点才可能缩短路径,所以只需要对这些点进行操作即可,这些点可能很大,所以根据数据的特性可以进行哈希。对于这些特殊的点可以通过佛洛依德算法来求内部的最短路,如此一来从起点到终点的最短路只可能经过俩个特殊点。最后,这是哥类似环状的题,俩个点的距离需要从俩个方向计算,取最小值。具体代码如下。#include<cmath>#include <iostream>#inclu

2020-07-27 23:17:18 94

原创 习题日常第十一练

1小木乃伊到我家(题目链接)用来加深迪杰斯特拉算法印象的一个板子题,具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#include<map>#include<cstring>#inclu

2020-07-26 22:04:26 57

原创 习题日常第十练

1最优乘车(题目链接)这个题的输入比较特别,需要用流或者快读来处理。要求最少的换乘次数,我们可以把每一个点都当作中转点看看,利用弗洛伊德算法的思想,求出从1到n的最少中转次数。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set&

2020-07-26 14:21:47 81

原创 习题日常第九练

1最短路(题目链接)最短路问题的第二练,这个题用的是贝尔曼—福德算法的队列优化。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<vector>#include<set>#include<map>#include<cstring>

2020-07-24 22:18:25 80

原创 习题日常第八练

1雷达安装(题目链接)这个题去年在校内的一次训练赛上做过,当时候和现在的思路差不多但是wa了无数次,我今天才明白为什么错。这个题可以用贪心的思路做,每一个都找多所需球心的最左和最右的坐标。关键是贪心是每一次尽可能的让一个新的雷达横坐标尽可能的大,所以排序的时候应该按照每一个小岛的所需最右坐标排序。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#in

2020-07-23 22:17:47 56

原创 习题日常第七练

1数字游戏(题目链接)这个题是典型的动态规划。首先,对于取模操作,直接取模会得到负数,所以取模后加十再取模保证了数字必定为正。再者,这是一个环,我们采用将环化为链的操作。然后,乘号一个一个往里面放,用一个三位数组表示,前两维表示序列起点和终点,最后一维表示乘号数。先将没有乘号的情况进行预处理。对于每一个序列有m个乘号,枚举它的间断点,将这个序列分为一个数和剩下有m-1个乘号的序列,注意这个操作是一个对称的,再根据动态规划得出最大,最小值。对于求最大的时候将数组初始化为0,可以用memset操作,但是求最小

2020-07-20 11:31:15 67

原创 习题日常第六练

1环状最大两段子段和(题目链接)这个题如果按照一般的思维,遇到环状,我们会把数组长度乘以2,将原来的头接到原来的尾部,然后进行处理。但是这个题一共有两种情况,一种是需要截取的俩段在中间,一种是截取俩头的和中间的一段。第一种情况可以通过分别前后求最大子段和,求法具体见博客。第二种只需要将每个数乘以负一,将需要去除的俩段去掉,求法与第一种一样。但是这种方法不能求全是负数或者有一个正数的情况。所以必须特判。具体代码如下。#include<cmath>#include <iostream&g

2020-07-19 20:10:13 85

原创 习题日常第五练

1矩阵取数游戏(题目链接)这个题的数据确实大,一开始准备用高精度,看过别人的题解以后发现int128也可以过,只是它的读入和输出需要另外的函数来完成。首先把2的幂次方都算出来备用,然后进行动态规划,因为只能从头或者尾取数,所以进行动态规划的时候,现在的长度代表的和等于头乘以相应的2的幂次方加上剩余和与尾乘以相应2的幂次方加上剩余和之中大的那一个。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#

2020-07-18 09:44:57 67

原创 习题日常第四练

1矩形覆盖(题目链接)这个题一开始我想到的是贪心,按照横向贪和纵向贪,但是想想很明显不对。由于看到洛谷对此题的标签是搜索,我就开始了漫漫搜索路。由于数据太小,所以递归搜索可以不怎么考虑剪枝,但是我还是写了一个在搜索的第一行。搜索目标为每个点,用b数组记录各个矩形的边界,每次递归后将相应的b恢复为递归之前的值,每次递归扩展边界。这个题还有个坑就是每个矩形相互之间不能有边,点重合,所以还要加特判,特判的时候用将俩个矩形的四个角判断,判断是否在对方矩形中。具体代码如下。#include<cmath&gt

2020-07-17 22:12:42 194 1

原创 习题日常第三练

1买表(题目链接)这个题是个多重背包问题,但是数据刚好到1e9,所以得通过bitset优化常数,不得不说,stl真香。对于每种钱币,都有一定的张数,要使得每一种张数都存在,假如有m张,可以用1,2,2^2, 23…2n,对于以上数求和sum<=m,这些数再加上m-sum,即可表示m以内所有张数。具体代码如下。#include<cmath>#include <iostream>#include<stdio.h>#include<string>#

2020-07-16 22:23:07 63

原创 习题日常第二练

1花生采摘(题目链接)这个题确实有不用递归的搜索,但是作为一个对于搜索不太熟练的新手,用递归搜索写了这个题还是对于搜索有了一定掌握。这个题看似复杂,实际比较简单,对于每一个有花生的地方用结构体存下,排序,然后逐个搜索,采用深度优先搜索的办法,直到搜不动或者搜完为止,如果所需要时间已经大于所给时间,回溯,具体见代码。搜索的时候一定要先判它是不是最后一个(不然只有一个格子有花生的情况会wa)。代码如下。...

2020-07-15 23:34:22 76

原创 习题日常第一练

今日习题1栈(题目链接)

2020-07-14 21:14:51 113

原创 四种排序

各种排序算法1冒泡排序 顾名思义,冒泡排序,大数(小数)上浮,具体见代码(由小到大排序)复杂度O(N^2) int a[20010]; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) //比较趟数 { for(j=0;j<n-i-1;j++) //每一趟确定后面一个值,故不用比较到n {

2020-07-13 15:26:07 122

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除