随笔分类 - 模板
摘要:链接:P3375 思路:理论版 通俗易懂版 KMP主要就是有一个next数组,这个数组可以让我们在匹配不成功的时候不用去从开始的位置+1去匹配,而是直接“ 跳”过来,来做到o(n+m)的复杂度的 #include<iostream> #include<cstring> #include<iostre
阅读全文
摘要:链接:P3902 这道题就是最长上升子序列的模板题,因为我们修改的时候可没说不能改成小数(暴力) 最长上升子序列有很多求法,这道题dp是不行的,TLE。 就要用nlogn的二分算法 这个算法是这样的,建立一个数组了,low,其中low[i]表示长度为i的上升子序列的结尾最小值 来考虑维护它,如果一个
阅读全文
摘要:我们的生活充满了未知与玄学 链接:P5367 康拓展开在此题就是求一个全排列的排名。 我觉得它适合用来优化内存,这样存全排列虽然还要展开,但是内存小啊。 康拓展开的原理 首先,我们要求出阶乘,不然会TLE, 然后根据公式计算就可以了。 ‘但是我们怎么知道对于每一个数,他是当前没有用过的数的排名呢?
阅读全文
摘要:链接:P1816 st表的一道模板题 链接:P1816 st表的一道模板题而已 你都可以用P3865稍微一改水过去 就是这么简单 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 in
阅读全文
摘要:链接:P3865 st表是一个用来解决RMQ问题的表 st表是一个二维数组,表示的是i~i+2^j-1范围的最值 (这东西和区间DP好像) 初始化: 因为2^0=1; 所以说st[i][0]存的就是i~i范围的最值(就是他自己) for(int i=1;i<=n;++i){ cin>>st[i][0
阅读全文
摘要:链接:P1894 我觉得这道题如果去掉题面,就是一道蓝题了。 这道题还是裸的二分图匹配,用匈牙利算法就可以AC掉。 什么是匈牙利算法?匈牙利 代码几乎差不多,也不需要优化,读入比模板题还复杂点,(他们应该换一下颜色) 1 #include<iostream> 2 #include<cstring>
阅读全文
摘要:链接:P3386 这道题要用到一个名为匈牙利算法的东西 匈牙利算法就是对于每一个点,(例如A)我们先从开始找一个点(例如B),如果他们相连,并且没有被拜访过(一个点一次只能被拜访一次),就让他们配对。然而,如果B已经和C配对了,就把C赶走,看看能不能找到一个D和C配对,如果有,就让C和D配对。让A和
阅读全文
摘要:链接:P4779 这道题卡了spfa和迪杰斯特拉朴素版 我们要使用优化版才行。 优化版是用了个堆来完成的。我们考虑一下,在初始化距离为无穷大后,对于每一个点,分成两类,一类是已经确定的,一类是没有的。对于已经确定的,我们没必要去扫描他。对于没有确定的,再分为两类,靠着一个已确定点的和没有的,那么对于
阅读全文
摘要:这是道坑比数论题。 它是如此的坑以至于我没法写上过程 (太长了) 过程:大佬 代码: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 long long x,y; 5 long long a,b; 6 void exg
阅读全文
摘要:链接:P3383 这道题考的是一个线性筛,主要有两种:埃氏筛和欧拉筛 先说埃氏筛,埃氏筛很简单。只要检查每一个数。如果他是没有被标记,就证明他是一个质数。这样我们就需要把他的每一个数标记为合数,然后重复 极为简单 1 #include<bits/stdc++.h> 2 using namespace
阅读全文
摘要:链接:P3379 【模板】最近公共祖先(LCA) 这道题我们要用到一种很神奇的东西,倍增。 首先,我们考虑一下最简单的做法,记录深度。然后先让询问的x,y中深度大的点往上爬,直到两个点深度一样结束。 然后两个点同时开始爬,当两个点相等时,就一定是公共祖先了 但是一个一个爬太慢了,怎么办呢? 我们就会
阅读全文
摘要:题目链接:P1119 简化题意: 这是一道floyed的题。但是有所不同的是,这道题里的点是有时间限制的。 所以说我们在做floyed的时候,我们不能直接枚举所有中转点,而是按照时间来进行。 以及,有可能出现询问的时候两个点没有修好,我们还要判断这个。 而且在这道题里,询问的t是不下降的,这样我们就
阅读全文
摘要:链接:P5057 [CQOI2006]简单题 其实这道题是树状数组的模板题 看一下题意,如果用树状数组,我们很容易想到差分数组。但是一般的差分数组是不行的 因为只有零和一,所以对于每一次操作,实就是让它在0和1中循环。而且,很容易得到,对于一个点进行了奇数次操作,他就会被改变,而偶数次操作就不变,知
阅读全文
摘要:01背包,是一个非常基础的东西 在此列出三种基本操作 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int f[10000][10000]; 5 int v[100000]; 6 int t[100000]; 7 i
阅读全文
摘要:链接:P3368 【模板】树状数组 2 看一下模板一?请点击 好,这道题让我们实现区间修改和单点查询。但是根据:1中我们可以发现,树状数组的操作只有修改单点和区间求和,那该怎么实现? 我们不可能强行加上这些功能,就需要进行改造。最简单的方法就是改变数组。 有一个数组,我们只要改变其中两个点,就可以实
阅读全文
摘要:链接:P3374 【模板】树状数组 1 树状数组是个很有用的数据结构,当然,有许多时候我们也可以用线段树代替他。 不过线段树比树状数组难得多,所以应该是用树状数组代替线段树才对。 比如说看看这个:[洛谷日报第22期]可以代替线段树的树状数组? 树状数组是一种基于二进制思想实现的数据结构,要用于查询任
阅读全文
摘要:堆的水题 MIku 这道题第一眼应该会很,懵逼,啥?搜索?贪心? 然后你仔细看看题目 “将长度为21的木板,第一次切割为长度为8和长度为13的,消耗21个单位的能量,第二次将长度为13的木板切割为长度为5和8的,消耗13个单位的能量,共消耗34个单位的能量,是消耗能量最小的方案。” 有没有发现什么?
阅读全文
摘要:题目链接:Miku 看一看这道题,我们很容易会发现采用模拟+遍历的方法会TLE 这时,我们就要采用这样一个东西了——单调队列(其实这也就是个单调队列模板) 单调队列,顾名思义,我们在使用时这个队列是有一定顺序(单调)的,并且它有一个特点,你的队列的极值一定在队首,知道这些,我们接可以做题了 单调队列
阅读全文
摘要:农夫约翰再显神威,双向热浪,双倍数组 (双倍大小,否则RE) 题目链接:MIKU 怎么说呢,裸的最短路,但是好像floyd不优化不行 SPFA好写是好写,但是容易被卡 有空还是学Dijkstra比较好 SPFA我觉得就是贪心,从初始点开始一圈一圈的往外扩,然后找的(或者被卡),竞赛最好不要用 (听说
阅读全文
摘要:题目链接:MIKU 我现在发现找BUG的最好方法————喝水 喝一次找一个,喝两次A道题 好,下面来分析这道题,这道题一看,大家一定就会想到并查集 (不知道并查集是什么?)请自行百度或者是看博客:(链接指向网址未完工) 但是,并查集我们是针对数的,而这道题都是字符串,怎么办呢?就是建立一个结构体来储
阅读全文

浙公网安备 33010602011771号