ACM知识
在ACM中的所思所想
Superb_Day
随缘
展开
-
子序列问题
(一)一个序列中的最长上升子序列(LIS)例题 :导弹拦截(求不上升序列长度和上升序列长度)#include <iostream>#include <algorithm>using namespace std;const int N = 100010;int a[N], d1[N], d2[N], n;int main() { while (cin >> a[++n]); n--; //输入 int len1 = 1, len2 = 1; //原创 2021-09-05 16:31:01 · 157 阅读 · 0 评论 -
Prim堆优化
#include<bits/stdc++.h>#define R register int//优化,可忽略#define P pair <int,int>using namespace std;int k,n,m;int cnt,sum,dis[10005],vis[10005];vector <int> E[200005];//存点vector <int> W[200005];//存边inline void add(int u,int v,.原创 2021-08-21 10:46:17 · 510 阅读 · 0 评论 -
tarjan强连通分量
原创 2021-08-19 14:53:26 · 77 阅读 · 0 评论 -
KMP算法
一、概述KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt共同发现的,故简称KMP,是用来处理字符串匹配问题的,它的时间效率可以达到O(n)。对于平常的字符串比较,时间效率为O(mn),线性扫一遍*字符串本身长度,孰高孰低一眼便知,所以掌握KMP算法还是很有必要的。二、模型展示假设有字符串A和B:A:ababaabab...B:abac开始匹配。...原创 2021-08-10 11:57:50 · 140 阅读 · 0 评论 -
基础计算几何(叉积)
图来源于网络。基本思路① 快速排斥实验(不涉及计算几何):如果两条边所在矩形不相交则一定不相交,即满足(min(x1,x2)<=max(x3,x4) &&min(x3,x4)<=max(x1,x2) &&min(y1,y2)<=max(y3,y4) &&min(y3,y4)<=max(y1,y2)) 才可能相交②跨立实验:即以其中一条线段为直线,判断另一线段的两端点是否在它两边,但是可能出现以下情况...原创 2021-08-07 20:00:26 · 492 阅读 · 0 评论 -
数论整理笔记
一、质数问题1、欧拉函数在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目)int phi[1000010]; void Euler_excel(int n)//n是打表打到多少{ phi[1]=0; for(int i=2;i<=n;i++) phi[i]=0; for(int i=2;i<=n;i++) if(!phi[i]){ for(int j=i;j<=n;j+=i){原创 2021-08-05 10:56:32 · 197 阅读 · 0 评论 -
利用typedef定义新类型
在结构体使用中,一直打struct会很麻烦,比如下面求两点之间的连线距离:struct Point {double x,y;};double dist(struct Point a,struct Point b){ return (a.x-b.x,a.y-b.y);}在c语言中,定义结构体的方法为“struct 结构体名词{域定义};”注意花括号后面还有一个分号。所有用到Point的地方都需要写一个struct。用以下方法可以避开struct,让结构体用起来和int,double.原创 2021-04-06 18:17:26 · 1325 阅读 · 0 评论 -
优化火车头
听说可以优化速度,代码来自于网络。#pragma GCC optimize(3)#pragma GCC optimize("Ofast")#pragma GCC optimize("inline")#pragma GCC optimize("-fgcse")#pragma GCC optimize("-fgcse-lm")#pragma GCC optimize("-fipa-sra")#pragma GCC optimize("-ftree-pre")#pragma GCC opti.转载 2021-04-06 10:58:43 · 830 阅读 · 1 评论 -
c++常用STL大总结
想了半天感觉写一些单个的stl专题过于麻烦,和网上的也差不多,不如写一篇总结,盘点一下主流的stl以及它们的作用,什么时候使用哪个比较好。理想状态下,这篇文章看完之后你就能比葫芦画瓢去用。一、当你需要(对数据进行一对一映射)/(用数据A找数据B)的时候 ------使用map1、介绍Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的处理能力。Map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很原创 2021-02-04 11:26:42 · 560 阅读 · 1 评论 -
矩阵乘法快速幂
今天员工小c写题的时候遇到了在第四黑厂时期就没填的坑,今日再次见面,自然是无奈,但是他请教了他的好朋友枫系,原来需要矩阵乘法快速幂的知识。Number Sequence时间限制: 1 Sec 内存限制: 256 MB题目描述此题HDUOJ数据过水,网上题解中直接将n%49的做法是错误的。A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7原创 2021-01-28 15:27:28 · 1156 阅读 · 4 评论 -
指针浅谈
我在中学的时候,指针学的就不太好(黑厂老板没咋讲,出来背黑锅! /狗头保命),上了大学发现还不熟悉,临近期末考试,再不会不行了,所以认真的再研究一下子。(这是黑厂的最后一个故事,该换世界观了,突然觉得时间过得好快)我用一个比较形象的方法来解释吧。int sum=16909060; 有个叫作sum的房子,里面有四个房间(int 为4个字节,char为1个,short为2个......),住着一个叫 16909060的家庭 ,这个家庭有 0x01 02 03 04 四个人(16进制),01 02..原创 2020-12-08 14:51:47 · 165 阅读 · 0 评论 -
零碎知识的备忘录
1)next_permutation()【#include <algorithm>】作用:求一个排序的下一个排列的函数,可以遍历全排列。参考案例:Noip普及组2004 火星人#include<bits/stdc++.h>using namespace std;int a[10005],n,m;int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++)scanf("%d",&am原创 2020-10-03 09:12:09 · 214 阅读 · 0 评论 -
归并排序求逆序对
今天是2018.11.9,明天就是NOIP,感觉自己基本数据结构已经差不多掌握了,但是在与学长luo y b对拍板子的时候突然发现逆序对和归并排序这个盲区,花了1小时差不多补上了。为了NOIP RP ++ ,特此水一篇,供以后的OIER借鉴。(PS.也许是人生最后一篇呢...)下面贴代码:void msort(int s,int t){ if(s==t) return; int m...原创 2018-11-09 09:24:51 · 270 阅读 · 0 评论 -
dijkstra堆优化
再求单源最短路径时,算法有优劣之分,个人认为在时间方面 朴素dijkstra>bellmanford>SPFA>dijkstra+heap,所以掌握dijkstra堆优化对于OIER是必要的。本文主要解说迪杰斯特拉堆优化的板子以及它所用到的知识;dijkstra算法、快读、stl以及链式前向星请自行百度或者看我的其他文章。代码如下,注释个人觉得已经很清楚了。#inc...原创 2018-10-20 10:16:30 · 936 阅读 · 0 评论 -
动态规划的个人感想
半停课状态的这几天,我猛肝了一波动态规划,突然有了以下一些思路和感想。1. 大多题目都可以使用动态规划来做,只是时间和空间是否允许的问题。 1.1 使用f数组描述状态,如果描述不清,加一维;还描述不清,再加一维。直到算法的时间或空间gg为止。n个[ ]可能大多数情况无法实现,但是我认为客观存在这种算法。 1.2 当[ ]与[ ]之间存在直接联系(比如横纵坐标的某些关系)或与其他[ ...原创 2018-10-16 08:41:29 · 498 阅读 · 0 评论 -
无限读入的两种方式
有时候我们会遇到无限读入的题目,需要按ctrl+z+enter结束输入,所以掌握无限读入的方法以应对毒瘤。scanf() 返回的是已经成功读入元素的个数。int n=0;方法一:while(scanf("%d",&a[++n])!=EOF);EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。ps. EOF=-1...原创 2018-10-15 10:23:05 · 440 阅读 · 0 评论 -
哈希开链法详解c++
一、概述这是哈希的一种算法,算是冲突比较少的,但是也难免会有。这是我们需要探究的问题,开链法就是好方法之一。开链法原理比较简单,代码比较玄学,大家要在学习的过程之中动手模拟,才能完全掌握它。int hash(string h){ int seed=37,p=10007; int ans=0; int len=h.length(); for(int i=0;i<n;...原创 2018-08-24 21:57:41 · 2860 阅读 · 1 评论 -
动态规划之背包01
一、概述动态规划可能是信息学中比较棘手的一块内容了,个人认为本质和搜索比较相似。背包问题01:有N件物品和一个容量为V的背包。第i件物品的价格(即体积,下同)是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。如果我们定义一个二维数组dp[i][j],dp[ i ][ j ] 表示 在面对第 i 件物品,且背包容量为 j 时所能获得...原创 2018-08-18 21:37:32 · 257 阅读 · 0 评论 -
分治算法
一、概述分治算法说白了就是把一个大型问题转化为小问题逐个解决。个人感觉和分治算法含有递归的意味。一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。总之,分治可以产生贪心,二分,线段树等问题。说实话,分治算法是一种思想,没有什么特定的...原创 2018-08-16 22:06:33 · 260 阅读 · 0 评论 -
多方法求素数(定义法、埃氏法、欧氏法)
一、概述素数,又称质数,一个你小学到现在都十分苦恼的老朋友。我上小学的时候,老师告诉我说把这个数用已经知道的素数从小到大一点一点试,假如说如果都不能除尽,那它就是个素数。前两天偶然辅导一个小学生的数学作业,发现几乎都使用素数表这个东西。(确实这种东西也比较玄学)那程序如何实现的呢?主要分为三个方法:定义筛法、埃氏筛法、欧氏筛法。各有用途,大家自行理解和使用。二、定义筛法定义法是...原创 2018-08-13 21:15:27 · 994 阅读 · 0 评论 -
最小生成树(kruskal算法)
一、概述最小生成树问题顾名思义,概括来说就是路修的最短。接下来引入几个一看就明白的定义:最小生成树相关概念:带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。最小生成树(MST):权值最小的生成树。最小生成树的性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈...原创 2018-08-07 21:46:13 · 110464 阅读 · 21 评论 -
超级简单并查集详解
一、概述并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。其实说白了大部分还是用于寻找两个点是否联通,求最小生成树。二、分析1、背景阐明首先我们需要先阐明一个简单的道理,假如从A城能到B城,从B城能到C城,那么自然A城和C城联通。并查集便是基于这个理论。...原创 2018-08-05 21:30:14 · 9718 阅读 · 7 评论 -
哈希概述
一、哈希概述Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。(by百度百科)简单来说,哈希是一种映射的体现,可以说是数据离散化、map等等的...原创 2018-07-27 14:39:25 · 894 阅读 · 0 评论 -
数据离散化略解
一、概述数据离散化是一个非常重要的思想。为什么要离散化?当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。打个比方,某个题目告诉你有10^4个数,每个数大小不超过10^10,要你对这些数进行操作,那么肯定不能直接开10^10大小的数组,但是10^4的范围就完全没问题。我们来看一下定义:离散化,把无限空间中有限的个体映射...原创 2018-07-26 08:30:27 · 19919 阅读 · 6 评论 -
超详细STL专题二:map
一、概述Map是c++的一个标准容器,起到映射作用,在一些程序中建立一个map可以起到事半功倍的效果,查找的复杂度基本是Log(N)。//(好复杂,这什么垃圾玩意,我就算WA,TLE都不可能用—————————————————————真香!)。需要用到头文件 #include<map>;二、原理说明什么是映射?举个例子,其实数组就是简单的映射:数组只能由整形向基...原创 2018-07-22 14:38:37 · 248 阅读 · 0 评论 -
超详细STL专题一:list
一、概述STL中,有一个重要的函数--list,理解后可以大大提升编程打代码的效率。它是一种双向链表,允许快速插入和删除,需要头文件 #include<list> 。二、结构展示1、载入我们可以用以下方式载入list:int data[5]={1,3,2,6,7}; list<int> listdata(data, data+5);也可以用...原创 2018-07-20 17:46:21 · 1253 阅读 · 0 评论 -
链式前向星基本原理
一、概述我们在学习图论的时候学习了一种图的存储结构--二维数组邻接矩阵储存,他虽然可以表达直观,快速访问连接两点的边,但是它占用空间大,只适用于点少的图,所以我们需要一种能够可以存储大型图的东西--链式前向星。 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位...原创 2018-07-19 20:44:55 · 9548 阅读 · 5 评论 -
关键路径详细原理
一、概述 关键路径,顾名思义,就是一个程序中最关键的路径,它关系到整个程序的时间进度,而关键二字指临界点。我们需要引进两个概念,AOE和AOV网。二、AOE和AOV网 AOE和AOV网都是一个大型程序的示意图。而AOV关注事件,AOE网关注时间。 举个例子:我需要写一篇博客,在脑回路清奇的我来看,应该具有以下步骤。首先写之前你的明白自己写什么吧(设定目标),然后你得有主干...原创 2018-07-18 20:30:21 · 4835 阅读 · 0 评论 -
拓扑路径详细原理
一、拓扑排序概述一场大型工程,我们往往把它看做多个子工程的集合体,这些小工程有的相互连接,一个是一个的子工程,有的相互并列,共处于一个工程的顺序之下,我们可以画一个图来表示这个工程和这些子工程的联系,它称为AOV网。举个例子:小S作为班级的学习委员,掌管全班的收发作业,他手下还有一些班干部,但是作业实在太多了,而且人手有限,不可能同时收发所有科目作业,所以,他决定权衡利弊,优先收脾气不好的...原创 2018-07-17 12:54:42 · 9591 阅读 · 0 评论 -
线段树原理及总结
一、概述 线段树是一种在线算法,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。二、原理分析及代码实现 我们从一个经典的例子来了解线段树,问题描如下:从数组arr[0...n-1]中查找某个数组某个区间内的最小值,数组中的元素的值可以随时更新。这使我们非常困扰,因为当数组非常...原创 2018-07-13 08:59:49 · 1247 阅读 · 1 评论