CSP-S第二轮认证总结——提高组算法总结

2023-10-30

 

目录

0.前言

一.动态规划——必考必考必考!!!

1.背包

(1)01背包

(2)完全背包

2.线性DP

3.多维DP

二.贪心

三.模拟

四.图论——很灵活

1.最短路

(1)spfa

(2)Dijkstra(+堆优化)时间复杂度远快于spfa

2.最小生成树

3.强连通分量

(1)有向图(含割点+缩点)

(2)无向图(含割点)

(3)无向图求每个连通分量

4.二分图匹配

四.数论

1.逆元

2.组合数

3.欧拉函数

(1)欧拉定理

(2)指数循环节

4.扩展欧几里得——求解二元一次方程组

5.中国剩余定理(CRT)

五.搜索

1.记忆化

2.剪枝——最重要的技巧

3.看范围答题

谢谢!

安心爆零,平安退役!


0.前言

算法这种东西,有时候其实并不管用,还是一波暴力走人,退役。。。。。。干脆。

一.动态规划——必考必考必考!!!

DP这种算法,不是说了概念就能懂得,只有身经百战,然后靠一波运气才行。下面有一些常见的DP考法:

1.背包

这种DP方式很常见,并且范围很广,而且有较明显的方法提示。就是在题目有求和的最大的限制,并且给你一个数列的时候,肯定是背包,说都不用说。还有个更明显的标志:每个数及其和不大!这里有两种常考背包:

(1)01背包

for (int i = 1; i <= n; i ++){//n表示物品种数
	for (int j = m; j >= w[i]; j --){//m表示背包容量
		dp[j] = max (dp[j], dp[j - w[i]] + v[i]);//w表示每种物品的体积大小,v则表示价值
	}
}
for (int i = 1; i <= m; i ++)
	ans = max (dp[i], ans);

(2)完全背包

for (int i = 1; i <= n; i ++){//各变量含义同上
	for (int j = w[i]; j <= m; j ++){//与01背包反过来
		dp[j] = max (dp[j], dp[j - w[i]] + v[i]);
	}
}
for (int i = 1; i <= m; i ++)
	ans = max (dp[i], ans);

但是不能完全靠这板子去得分,题目经常都很灵活,但是只要稍微改动一下就行了。比如:让背包去存已经用的物品个数,因为题目限制了物品个数。

典例:NOIP2018 提高组Day1 T2 货币系统

2.线性DP

这种DP就包括最长公共上升子序列,最长上升(下降)子序列,单调队列,背一下,这种题目挺好做的。

3.多维DP

这是最难想的DP类型的题目,通常在一个矩阵的背景下进行,这种特别难,只有多花时间想一想,有几个经典的类型:

1.最大子矩阵:一行一行的往下转移

2.创意吃鱼法:一层一层的往左和往下扩展

总而言之,从一个下标转移到下一个下标,或从一排转移到下一排的转移方式,是DP的精髓。

DP优化我就不想说了,比如斜率优化、平行四边形优化根本就不是我的料。

二.贪心

贪心和动态规划容易搞混,但是记住,需要状态转移,有多种情况的就是动态规划,所谓多种情况,就是你贪心考虑不到。

贪心的精髓就是。所以贪心经常需要排序,这有点玄学,反正我有点懵,凭着感觉去贪就行了。

三.模拟

我认为,这个就不叫算法,其实就考察一个东西:细心

四.图论——很灵活

这个算法不仅内容多,而且考的非常灵活,经常让你手足无措,最后看了题解才发现就一个最小生成树(举个例子)而已。

这里先上模板:

1.最短路

spfaDijkstra(floyd就不说了)

(1)spfa

这个我就不想说了

(2)Dijkstra(+堆优化)时间复杂度远快于spfa

点击打开链接

注意,Dijkstra是不能有负环的,是有spfa才能判环(若一个点进入n+1次,就存在环)

2.最小生成树

直接上了:

bool cmp (int x, int y){
    return w[x] < w[y];
}
void makeSet (int x){
    for (int i = 1; i <= x; i ++)
        fa[i] = i;
}
int findSet (int x){
    if (x != fa[x])
        fa[x] = findSet (fa[x]);
    return fa[x];
}
void unionSet (){
    for (int i = 1; i <= k; i ++){
        int e = r[i], U = findSet (u[e]), V = findSet (v[e]);//特别注意是u[e]而不是u[i],我曾经错过
        if (U != V){
            ans += w[e];
            fa[U] = V;
            Sum ++;
        }
    }
}
int main (){
    scanf ("%d %d", &n, &m);
    makeSet (n);
    for (int i = 1; i <= m; i ++){
        k ++;
        scanf ("%d %d %d", &u[k], &v[k], &w[k]);
        k ++;
        u[k] = v[k - 1];
        v[k] = u[k - 1];
        w[k] = w[k - 1];
    }
    for (int i = 1; i <= k; i ++)
        r[i] = i;
    sort (r + 1, r + 1 + k, cmp);
    unionSet ();
}

3.强连通分量

这个算法你不能打错任何一个字母,因为一点细微的差错可能导致全盘崩溃。但是这个算法考的可能性不大

(1)有向图(含割点+缩点)

void Tarjan (int u){//求强连通分量
    DFN[u] = LOW[u] = ++ now;
    instack[u] = 1;
    s.push (u);
    for (int i = 0; i < G[u].size (); i ++){
        int v = G[u][i];
        if (! DFN[v]){
            Tarjan (v);
            LOW[u] = min (LOW[v], LOW[u]);
        }
        else if (instack[v]){
            LOW[u] = min (DFN[v], LOW[u]);
        }
    }
    if (DFN[u] == LOW[u]){
        num ++;
        int v;
        do {
            v = s.top ();
            s.pop ();
            instack[v] = 0;
        }while (u != v);
    }
}

(2)无向图(含割点)

void Tarjan (int x, int fa){
    dfn[x] = low[x] = ++ cntd;
    int children = 0;
    for (int i = 0; i < G[x].size (); i ++){
        int tmp = G[x][i];
        if (! dfn[tmp]){
            children ++;
            Tarjan (tmp, x);
            if (low[tmp] >= dfn[x])
                isgedian[x] = 1;
            low[x] = min (low[x], low[tmp]);
        }
        else if (dfn[x] > dfn[tmp] && fa != tmp){//注意fa!=tmp
            low[x] = min (low[x], dfn[tmp]);
        }
    }
    if (fa < 0 && children == 1)//注意
        isgedian[x] = 0;
}

(3)无向图求每个连通分量

void DFS (int x){
    vis[x] = num;
    sum ++;
    for (int i = 0; i < G[x].size (); i ++){
        int tmp = G[x][i];
        if (isgedian[tmp] && vis[tmp] != num){//注意vis[tmp]!=num
            cut ++;
            vis[tmp] = num;
        }
        else if (! vis[tmp])
                DFS (tmp);
    }
}

4.二分图匹配

本蒟蒻实在太弱,不会模板,但一定要了解它的意思,概念。

四.数论

这个算法对于我来说就是学了也不会,因为只会板子,做题怎么也做不起,我太难了。但是有几个必背的板:

1.逆元

a/bmodc = a*b^{c - 2}modc

rfac[0] = rfac[1] = 1;//rfac表示逆元,如果空间不满足,用qkpow暴力求
for (int i = 2; i <= MAXN; i ++)
    rfac[i] = rfac[mod % i] * (mod - mod / i) % mod;

2.组合数

C_{m}^{n}=\frac{m!}{n!(m - n)!}

//法一:特别快
int C (int m, int n){
    return fac[m] * rfac[n] % mod * rfac[m - n] % mod;
}
//法二:基础
int C (int m, int n){
    if (n > m / 2)
        n = m - n;
    int ans = 1;
    for (int i = 1; i <= n; i ++){
        ans = ans * (m - i + 1) / (n - i + 1);
    }
    return ans;
}

优化:Lucas定理

C_{n}^{m}modp=C_{n mod p}^{m mod p}*Lucas_{n/p}^{m/p}modp

int Lucas (int n, int m){
    if (n == m || !m)
        return 1;
    return C (m % p, n % p) * Lucas (m / p, n / p) % p;
}

常用处:杨辉三角

递推式:f[i][j]=f[i-1][j] + f[i-1][j-1]

3.欧拉函数

int phi (int x){
    int res = x;
    for (int i = 1; i * i <= x; i ++){
        if (x % i == 0){
            res = res / i * (i - 1);
            while (x % i == 0)
                x /= i;
        }
    }
    if (x > 1)
        res = res / x * (x - 1);
    return res;
}

相关定理:

(1)欧拉定理

a^{\phi (p)}\equiv 1(modp)(a与p互质)

(2)指数循环节

常用于指数太大时。

a^{b}modp=a^{bmod\phi(p)+\phi(p)}modp(可一直递推下去)

4.扩展欧几里得——求解二元一次方程组

ax+by=1(gcd(a,b)=1)

int exgcd (int a, int b, int &x, int &y){
    if (!b){
        x = 1, y = 0;
        return a;
    }
    int r = exgcd (b, a % b, y, x);
    y -= a / b * x;//核心关键
    return r;
}

5.中国剩余定理(CRT)

//b[i]是模数,p[i]是同于是右边的ai,M是所有模数的公倍数
void exgcd (int a, int b, int &x, int &y){
    if (! b){
        x = 1;
        y = 0;
        return ;
    }
    exgcd (b, a % b, y, x);
    y -= a / b * x;
}
int main (){
    int ans = 0;
    int x, y;
    for (int i = 1; i <= n; i ++){
        int tp = M / b[i];
        exgcd (tp, b[i], x, y);
        ans = (ans + p[i] * tp * x) % M;
    }

五.搜索

这种算法,相信都家喻户晓。但是,同样是爆搜,人与人做出来却不一样。有的人只能卡个暴力分,而有的人他就A了,连DP题目他都能用搜索过掉,这就是搜索技巧的问题了(隆重为大家推荐一个大佬,曾经用搜索过掉了分组背包,惊呆了(点击:孙子))。下面隆重介绍两个在考试时能够发挥神威的技巧:

1.记忆化

只要空间允许,这种方法就能省掉重复计算的过程,快得一批。

2.剪枝——最重要的技巧

剪枝十分重要,但是十分难想,甚至有时后很玄学,但是这里有几个常见的技巧:

(1)如果当前的答案已经不比已经得出的答案优,就直接回溯;

(2)如果当前的值不行,就不要去试后面重复的值,通常附带一个排序。

3.看范围答题

这是最有趣的,大家要有想象力,说不定搜一半,再DP一般就过了呢?或者。。。。。。

典例:

小奇取石子

但是重点在于:看数据范围,数据大的稍暴力,反之DP或优化。额,有点骗分的样子。。。。。。

谢谢!

安心爆零,平安退役!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSP-S第二轮认证总结——提高组算法总结 的相关文章

  • token 存储,token失效

    1 token 在诸多组件中可能用得到 建议用vuex管理数据 包裹同步mutations 和异步 actions 整个模式就变成vuex到actions 业务组件中直接触发actions函数 2 vuex存储数据的方式 基于内存 特点 存
  • USB学习系列之二——USB设备的插入检测

    1 USB的插入检测机制 USB端口的D 和D 均用一个15k的电阻接地 当无设备接入时 均处于低电平 在设备端在D 表示高速设备或者全速设备 或者D 表示低速设备 接了一个1 5k的上拉电阻到 3 3v 一旦将设备接入 USB端口的D 或
  • JavaScript基础知识全总结

    JavaScript基础 浏览器说明 浏览器是指可以显示网页服务器或者文件系统的HTML文件内容 并让用户与这些文件交互的一种软件 通俗的讲 可以显示页面的一个软件 国内网民计算机上常见的网页浏览器有 QQ浏览器 Internet Expl
  • 快速傅里叶变换FFT总结

    快速傅里叶变换 在竞赛中离散傅里叶变换DFT及其逆变换IDFT尤为常用 主要用于快速求多项式的乘积 形式化地说 多项式就是某个 f x i
  • springboot 微信小程序 对接微信支付功能(完整版)

    微信小程序对接微信支付功能 业务流程时序图 JAVA版 1 项目架构 2 pom xml配置文件 3 小程序账号参数配置类 4 JAVA 通用代码 4 1 工具类 4 1 1 IdGen id生成类 4 1 2 Render 响应结果类 4
  • 2020这一年,我完成了这几件大事

    2020这一年 我完成了这几件大事 1 感情 拥有了余生的合伙人 2 工作 找到了自己喜欢的方向 一个长处 3 生活 走走停停 4 读书 兴之所至 1 感情 拥有了余生的合伙人 1 3 关键词 殇 4 6 关键词 静 7 9 关键词 安 1
  • 查看Linux系统信息

    1 登录到linux服务器执行 lsb release a 命令 即可查看所有版本信息 这个命令适用于所有的linux 包括Redhat SuSE Debian等发行版 注意 centos需要安准lsb LSB是一套核心标准 它保证了LIN
  • val()、html()方法改变元素值后,元素change事件无效解决方案

    原因 Change事件触发有两个必要条件 值改变 失去焦点 解决方法 改变值的同时 1 手动触发change事件 input val change input val trigger change 2 手动触发blur事件 input va
  • 第六节:JS中的加减乘除和比较赋值

    1 乘性操作符 乘法 除法 模运算 运算原则 先将运算内容转换为数字 然后进行计算 如果转换失败会返回NaN 小数 会出现0 1 0 2 不等于 0 2的误差 与0 1 0 2 不等于 0 3 原理相同 结果 数字或者NaN 能转换数字的结
  • Python-GIL深度理解

    1 GIL介绍 GIL 意为全局解释器锁 是cPython执行多线程 进程计算密集型代码效果不如人意的主要原因 cPython限制一个进程内同时只能执行一个线程 首先介绍一下 正常多线程 进程执行时 多线程 进程数据混乱的原因 cpu分成多
  • blender基础笔记

    1 下载与安装 官网下载 官网下载 setam下载 steam下载 个人推荐这个 方便 修改语言 左上角 edit preferences Interface Transtation Langlish 疲了 看图吧 懒得写了 2 基础操作
  • 第二节:数据类型——number和string

    上节回顾 undefined为window的属性 有些程序会在函数开始置定义一个var undefined 这是因为undefined是window的一个属性 当你判断某一个东西是不是undefined的时候 计算机会到window中整体去
  • 高精度斐波那契

    1 为何会有高精度斐波那契一说 0 0 1 1 2 1 3 2 4 3 5 5 6 8 7 13 8 21 9 34 10 55 11 89 12 144 13 233 14 377 15 610 16 987 17 1597 18 258
  • Spark 架构,计算

    1 架构设计图 2 用户交互方式 1 spark shell spark命令行方式来操作spark作业 多用于简单的学习 测试 简易作业操作 2 spark submit 通过程序脚本 提交相关的代码 依赖等来操作spark作业 最多见的提
  • VMware Workstation Pro 16 安装win7

    本文使用U盘工具创建 至于为什么安装win7 毕竟很多游戏在win10已经没法玩了 1 创建虚拟机 典型创建即可 2 添加硬盘 SCSI类型 使用物理磁盘 物理驱动2 使用整个磁盘 这里的驱动2就是U盘 创建完成 这时候应该是正在使用该设备
  • ES6(这是我见过写的最好的)!推荐

    文章目录 ES6总结 var let const的区别 箭头函数和function的区别 结构赋值 原型 原型链 继承 1 原型链继承 2 构造函数继承 3 组合式继承 4 class类继承 Promise async和await Gene
  • JavaScript实现三子棋

    目录 要做的事 1 初始化棋盘 2 落子操作 3 判断获胜 4 轮流落子 5 重置棋盘 6 棋盘判满 7 源代码 8 效果展示 要做的事 1 初始化棋盘 首先棋盘是一个3 3的二维数组 而我们的二维数组又是分别由一个一个的一维数组组成的 如
  • 高校巡讲总结—侯伯薇讲师

    这个月里面 借助CSDN的平台 在三所高校中做了 程序员修炼之路 的巡讲 在其中讲述了自己的一些经历 并和同学们聊了学习 思考和分享这三个要素 三所高校各自有各自的特点 感觉很有意思 一一叙述如下 首先 第一站是在辽宁工程技术大学 位于葫芦
  • 2021->2022

    也就随便写写了 记得去年的年终和期望目标 我写了好多个方面的自我剖析 可能大概有三四千字吧 再回去看看 还是水了一些 这很正常 大多数人都是这样的 况且我比较佛系 复盘还是要的 期望还是要提的 虽然明知一年过后 可能达成的不多 但这也是一次
  • 2020/10/26近期工作总结-vue开发

    1 父子传参 父传子 方法1 在父组件中加入子组件 给子组件绑定需要传递的值 import Policy from components policy 保单信息组件 components Policy

随机推荐

  • qnap安装Linux程序,[Troy]瞎折腾 篇一:【智能家居】威联通QNAP TS-251A安装Ubuntu+Hassio+Samba经验分享...

    原标题 Troy 瞎折腾 篇一 智能家居 威联通QNAP TS 251A安装Ubuntu Hassio Samba经验分享 Home Assistant是一款基于 Python 的智能家居开源系统 支持众多品牌的智能家居设备 可以轻松实现设
  • win11 vs2019下的qt5.15安装配置

    一 vs2019 先前安装过的版本 在此不做赘述 仅为前提条件 二 qt安装 1 qt版本选择 目前qt更新到6 3 但因为6的版本太新 而5 15是一个LTS长期维护版本 维护期一直到2025年 所以在此选择qt5 15版本 2 qt在线
  • 给Tomcat添加第三方jar包、如何在IDEA中启动部署Web模板

    给Tomcat添加第三方jar包 第一种方式 1 将jar包放到lib目录中 2 将jar包加入到模块中 Add as Library 第二种方式 1 可以打开项目结构菜单项目操作界面 添加一个自己的类库 2 添加你类库需要的jar包 3
  • 美国读研计算机 回国后好就业吗,美国留学归国就业前景如何

    很多在美国留学的小伙伴们都会选择在毕业后回国发展 那么 美国留学归国的就业前景如何呢 感兴趣的小伙伴快来阅读出国留学网的这篇文章吧 希望可以为大家提供参考 美国留学回国就业前景 1 医药领域专业人才和相关人才需求量增加比重最大 其中对应的包
  • LaTex加入新package方法

    1 前几天去 https www ctan org 下载booktabs宏包 下载的文件中没有sty文件 有ins文件 用winedit打开ins文件 用late编译 同一个文件夹中得到了一个sty文件 2 将sty文件拷贝到相应的late
  • numpy--广播及np.shape的案例

    numpy广播 最近有一个小需求 给定 a 0 1 2 M 1 1 1 1 求得 T 0 0 0 0 1 1 1 1 2 2 2 2 经过尝试 终于采用如下代码成功 a reshape 3 1 M reshape 1 4 reshape 3
  • PID算法,计算的是差值,是差值

    typedef struct float Kp 比例系数Proportional float Ki 积分系数Integral float Kd 微分系数Derivative float Ek 当前误差 float Ek1 前一次误差 e k
  • JAVA代码实现抖音转载视频无水印视频,亲测通过

    许多小伙伴想做抖音视频 无奈没有摄影器材 也没有取景材料 就想着去用别人人气视频来提高自己的粉丝量 可问题又来了 别人的视频通过分享 或者链接根本不是原创 上面还带着水印 视频一挂上去就被发现了 小则视频不通过 给出警告 大则封号 降低视频
  • Linux centos8安装docker

    1 下载docker ce的repo curl https download docker com linux centos docker ce repo o etc yum repos d docker ce repo 2 安装依赖 yu
  • vue3实现导航栏绑定内容锚点+滚动动画

    目前用的两种方法实现 第一种 原生js实现 注意 因为移动端可滚动区域可能会嵌套在其他架子下 所以需要用到ref获取滚动区域 正常获取scrollTop 前者基于html 后者基于body scrollTop document docume
  • 017-Java-008

    实例变量 实例变量声明在一个类中 但在方法 构造方法和语句块之外 当一个对象被实例化之后 每个实例变量的值就跟着确定 实例变量在对象创建的时候创建 在对象被销毁的时候销毁 实例变量的值应该至少被一个方法 构造方法或者语句块引用 使得外部能够
  • STM32移植lwip之建立web服务器

    本篇目标 在之前能ping通pc机的工程基础上搭建web服务器 借鉴官方web服务器的程序与网页 能够用pc机浏览器访问web服务器 并返回设置的网页 材料准备 基础工程 修改后能ping通pc机的工程 STM32官方移植lwip修改代码
  • Redis中使用Lua的一些优化和注意事项

    EVAL EVALSHA命令 Redis从2 6 0版本开始提供了eval命令 通过内置的Lua解释器 可以让用户执行一段Lua脚本并返回数据 因为Redis单线程模型的特点 可以保证多个命令的原子性 因为最近的项目才想到用Lua 详细的使
  • 火牛(STM32) 多路ADC采样数据经过RS485传输到另一块ARM板路虎(LPC1768)

    调试了好几天终于搞定ADC多路的数据采集 然后通过RS485传输到另一块ARM板上 上程序 火牛开发板基础实验 串口实验 在串口1中输出实验标题 并打印串口1输入的字符 串口中断接收 include stm32f10x h include
  • 嵌入式Linux webserver: Boa+CGI程序设计技术

    摘要 在详细介绍一种嵌入式Web服务器BOA的实现与配置方法的基础上 以一个Web在线远程监控GPIO 通用输入 输出 的程序为实例 介绍嵌入式Linux系统下CPU程序设计技术 关键词 嵌入式系统Linux BOA CGI GPIO 1
  • java中strictfp关键字,java strictfp关键字用法大全详解

    一 strictfp关键字简介 strictfp是Java中提供的一个保留关键字 该关键字是从这第java JDK2版本儿开始出现的一直沿用到现在 只不过很多情况下都不怎么使用 所以容易被大家遗忘 因此今天我们来介绍一下这个关键字的用法和使
  • 【深度学习环境-2】nvidia驱动、cuda安装配置

    一 ubuntu系统安装nvidia驱动 方法一 禁用nouveau驱动 1 打开文件 sudo vim etc modprobe d blacklist conf 2 在末尾添加 blacklist nouveau 3 更新设置 sudo
  • abap append 用法

    转自http blog chinaunix net uid 7982817 id 91999 html Append用法总结 2008 11 14 11 42 19 分类 Syntax APPEND wa INITIAL LINE LINE
  • molloc/free和new/delete的区别

    malloc free和new delete的区别 malloc free和new delete的共同点是 都是从堆上申请空间 并且需要用户手动释放 不同的地方是 malloc和free是函数 new和delete是操作符 malloc申请
  • CSP-S第二轮认证总结——提高组算法总结

    目录 0 前言 一 动态规划 必考必考必考 1 背包 1 01背包 2 完全背包 2 线性DP 3 多维DP 二 贪心 三 模拟 四 图论 很灵活 1 最短路 1 spfa 2 Dijkstra 堆优化 时间复杂度远快于spfa 2 最小生