跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

算法实战:预处理、滑窗、前缀和哈希、DP 与并查集

算法实战中常见的预处理、滑窗、前缀和哈希、线性 DP 及并查集技巧汇总。选取洛谷经典题目,深入解析寻宝问题的模拟优化策略,以及村村通场景下的图连通性计算。通过具体代码实现,展示如何减少时间复杂度,提升解题效率,适用于蓝桥杯及算法竞赛备考。

星星泡饭发布于 2026/3/22更新于 2026/5/23 浏览
算法实战:预处理、滑窗、前缀和哈希、DP 与并查集

这些题目摘录自洛谷,属于考察各类算法运用的典型好题,适合用于蓝桥杯及各类算法比赛的备战练习。重点在于锻炼解题思路,从掌握算法模板过渡到分析具体应用场景。

1. 寻宝

题目: P1076 [NOIP 2012 普及组] 寻宝

在这里插入图片描述

解法:模拟 + 优化

根据题意模拟爬楼过程。如果每层楼都遍历去找特定房间,时间复杂度会很高。我们可以优化这个过程:用一个 cnt[i] 数组记录第 i 层楼有楼梯的房间数。当需要找第 s 个符合要求的房间时,利用取模运算 s % cnt[i] 直接定位。注意如果取模结果为 0,则对应的是该层的最后一个符合条件的房间。

#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e4 + 10, M = 110, MOD = 20123;

LL n, m;
bool st[N][N]; // 标记楼梯信息
LL s[N][M];    // 维护指示牌信息
LL cnt[N];     // 用于优化,存第 i 楼有楼梯的房间个数

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < m; j++) { // 注意:房间编号从 0 开始
            int a, b;
            cin >> a >> b;
            if (a) {
                st[i][j] = true;
                cnt[i]++;
            }
            s[i][j] = b;
        }
    }

    int pos = 0;
    cin >> pos;
    LL ret = 0;
    for (int i = 1; i <= n; i++) {
        ret = (ret + s[i][pos]) % MOD; // 优化累加
        LL step = s[i][pos] % cnt[i];
        if (!step) step = cnt[i];      // 注意取模为 0 的情况
        while (1) {
            if (st[i][pos]) step--;
            if (step == 0) break;
            pos++;
            if (pos == m) pos = 0; // 走了一圈
        }
    }
    cout << ret << endl;
    return 0;
}

2. 村村通

题目: P1536 村村通

在这里插入图片描述

解法:图的性质 + 并查集

这道题的目标是将已经连接好的部分城镇和未连接的城镇全部连通。所需添加的边数等于连通块的个数减 1。因此,我们需要用并查集来维护当前连通的点集。输入可能包含多组数据,通常以 Ctrl+Z 结束。

#include <iostream>
using namespace std;
const int N = 1010;
int n, m;
int fa[N];

int find(int x) {
    if (fa[x] != x) fa[x] = find(fa[x]);
    return fa[x];
}

void unite(int x, int y) {
    int fx = find(x);
    int fy = find(y);
    if (fx != fy) fa[fx] = fy;
}

int main() {
    while (cin >> n && n != 0) {
        for (int i = 1; i <= n; i++) fa[i] = i;
        cin >> m;
        while (m--) {
            int u, v;
            cin >> u >> v;
            unite(u, v);
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            if (fa[i] == i) cnt++;
        }
        cout << cnt - 1 << endl;
    }
    return 0;
}

目录

  1. 1. 寻宝
  2. 2. 村村通
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于数据流架构扩展 RAG 提升大模型准确度
  • StructBERT-Large 单句对多句批量检索开发指南
  • 数据结构:二叉树精选 9 道 OJ 练习
  • Java 图像处理实战:马赛克与灰度算法及底层原理解析
  • OpenClaw 与 Telegram 机器人集成
  • Spring Boot 4 新特性:Jackson 3 ObjectMapper 异常处理简化,无需 try-catch
  • AI 辅助前端入门实战:从零构建第一个网页
  • 基于STM32与NB-IoT的温室智能调控系统
  • OpenClaw 国内 AI 大模型配置教程
  • 2024 年大模型方向求职面试经验总结与指南
  • VSCode Copilot 插件卡顿问题解决方案
  • OpenClaw 结合 Qwen3.5 实现本地 AI 助手部署指南
  • Electron 实战:按需构建与打包体积优化
  • 鸣潮 QQ 机器人部署指南:GsCore 核心与 NoneBot 插件配置
  • Mac 平台 Homebrew 安装配置及常用命令详解
  • C 语言快速排序算法详解与优化实现
  • 杭州E类人才认定流程与福利指南
  • 机器学习:聚类分析算法详解
  • Trae AI 原生 IDE 安装与使用指南
  • OpenCLaw Web UI 无法访问 Not Found 问题排查与解决

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online