知识点总结
bnc1010
这个作者很懒,什么都没留下…
展开
-
反素数
最近才接触到反素数,放一个大佬的链接反素数的概念:先定义g(x)为g的约数的个数,如12有1,2,3,4,6,12,所以g(12)=6。如果某个整数x满足:g(x)>g(i),i 取(0,x),那么x为反素数。 注:约数,因数,因子都是同一个概念。真因子就是在这个基础上除去本身。任意一个合数都可以表示为素数的乘积形式:N=p1^e1*p2^e2*p3^e3*p4^e4…… p1,...原创 2018-08-24 13:40:12 · 4220 阅读 · 2 评论 -
单调栈在矩阵问题中的简单应用
定义:单调栈维护的是一个元素具有单调性的栈,单调性有递增、递减、不减、不增这四种。具体操作:以递增为例,若栈为空,直接push。非则需要判断当前元素的值(用x表示)和栈顶元素(用top表示)的大小关系:若x>top,则直接push;若x<=top,需要pop栈顶元素,直到栈为空或者top<x,然后再push。如果有一个数组:5,3,6,2,9,7,1,4栈为空,直...原创 2019-04-02 18:35:16 · 800 阅读 · 0 评论 -
可持久化字典树模板
一般字典树:void update(char *s){ int len=strlen(s); int rt=0; for(int i=0;i<len;i++){ int xb=s[i]-'a'; if(!tree[rt][xb])tree[rt][xb]=++tot; //tsize[tree[rt][xb]]++; ...原创 2019-08-21 08:46:53 · 349 阅读 · 0 评论 -
迭代加深dfs优化
当普通dfs搜索答案时,有时会有搜索的深度较深状态较多,而答案所在的深度却比较小的情况。比如说下面这个图中,目标状态是红框的那个点,它的深度很小,但是左侧有很多的状态,普通dfs必须要搜完左侧所有状态才会搜到目标状态,这样就很容易超时。对此可以在dfs的时候限定一个深度的状态,这个深度是从小到大枚举的,直到搜到答案。如果我们限定dfs的深度是1,那么就只有两个状态,目标状态第二次就搜到了,实现...原创 2018-10-24 18:23:37 · 1824 阅读 · 0 评论 -
双向bfs
自从暑假学长讲过这个之后,现在才开始写第一道双向bfs题目。其实双向bfs很简单就是分别从起点和终点做两个bfs,以此大幅度减少搜索的状态数,从而解决一些普通单向bfs容易超时的问题。q1从起点bfs的队列,q2从终点bfs的队列,vis1存从起点bfs的状态,vis2存从终点bfs的状态。双向bfs的核心:在q1的bfs中的一种状态有三种情况:1.vis1中不存在,在vis2中存在,说明这...原创 2018-10-23 20:20:28 · 2834 阅读 · 0 评论 -
树链剖分板子
板子题链接:https://www.luogu.org/problemnew/show/P3384个人理解:树链剖分最重要的作用是实现了重链上的节点序号都是连续的,这样对于更改和查询一条树链就变成了区间操作,可以用线段树实现。#include&lt;bits/stdc++.h&gt;using namespace std;#define lson rt&lt;&lt;1#define ...原创 2018-10-08 20:16:09 · 185 阅读 · 0 评论 -
归并排序
归并排序是一种很不错的排序方法,速度比较快,而且比较稳定。所以想研究一下,就瞎写了一个。思想还是很容易理解的:先分到底,然后在合的时候排序原数组:5 3 5 7 8 4 2 6分成两半:5 3 5 7 8 4 2 6再分: 5 3 5 7 8 4 2 6再分: 5 3 ...原创 2018-09-20 19:16:48 · 104 阅读 · 0 评论 -
最小生成树
prim:时间复杂度:边数^2,对于边很多的题目不太适合这个算法。过程:随便选一个点开始,从这个点的边中选一条最短的边,也就是把这条边的另一个点加入到树中来。然后再从这两个点相连的边的中选一条最短的边,把第三个点加入到树中。当然选的这条边的另一个端点是当前不再树中的。然后一直下去,直到选了n-1条边,这个时候树就完成了。这其实是一个很暴力很贪心的过程。代码://我的写法和网上很多博客的都不太...原创 2018-09-24 14:45:08 · 113 阅读 · 0 评论 -
链表
为组员写个链表,暂时没有发现bug#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include&amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt;class List{ private:struct ListNode { int data; ListNode *nxt; };原创 2018-09-18 19:14:03 · 92 阅读 · 0 评论 -
st
对于给定区间询问最大最小值的问题在之前主要都是用线段树来处理的。st也可以处理一些简单的rmq问题,但是有个前提,没有在线修改区间的内容。在这个前提之下,st有很大的优势,一个是代码比较短,还有一个是时间复杂度比较小(预处理Onlogn,询问O1)。以询问最大值为例,用一个二维数组 stmax[i][j]表示从第i个位置开始,连续2^j的长度的区间里的最大值。先预处理一下stmax[i][0]...原创 2018-08-24 20:49:50 · 563 阅读 · 0 评论 -
树状数组种类合集
单点更新,区间查询 hdu1166#include&lt;bits/stdc++.h&gt;using namespace std;const int maxn=50005;int num[maxn],tree[maxn];int n;int lowbit(int x){ return x&amp;(-x);}void updata(int pos,int k)...原创 2018-08-28 21:24:14 · 245 阅读 · 0 评论 -
素数小结
素数的定义:一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数或者素数。刚开始接触c语言的时候,判断一个数n是否为素数采用的是最朴素的思想:枚举2到根号n,如果有一个数可以整除n,那么这个数一定是合数。如果没有一个数可以整除,那就是素数了。int n;bool ff=false; scanf(&amp;quot;%d&amp;quot;,&amp;amp;amp;n);for(int j=2;j&原创 2018-08-24 11:05:18 · 476 阅读 · 0 评论 -
LIS(On^2,Ologn,Ologn找出一个序列)
//On^2#include<iostream>#define INF 0X3f3f3fusing namespace std;int dp[500],a[500];int main(){ int n; while(~scanf("%d",&n)&&n) { for(int i=0;i<n;i++) scanf("%d",&am...原创 2018-02-09 12:08:12 · 628 阅读 · 0 评论