【蓝桥杯】每日练习 Day18

目录

前言

动态求连续区间和

分析

代码

数星星

分析

代码

星空之夜

分析

代码


前言

接下来是今天的题目(本来是有四道题的但是有一道题是前面讲过(逆序数的,感兴趣的小伙伴可以去看我归并排序的那一篇)的我就不再过多赘述了。)

两道树状数组和一道哈希的题目。


动态求连续区间和


分析

树状数组的模板题啊,我就不过多赘述了,大家看代码就好。


代码

#include<iostream>
using namespace std;
const int N = 100010;
int n, m;
int tree[N];
​
int lowbit(int x)
{return x & -x;
}
​
void insert(int i, int x)
{if(i > n) return;tree[i] += x;insert(i + lowbit(i), x);
}
​
int find(int i)
{if(i == 0) return tree[i];return tree[i] + find(i - lowbit(i));
}
​
int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++){int x; scanf("%d", &x);insert(i, x);}while(m--){int k, a, b;scanf("%d%d%d", &k, &a, &b);if(k == 1)insert(a, b);elseprintf("%d\n", find(b) - find(a - 1));}return 0;
}

数星星


分析

发现题目要求的是类似前缀和的一块区域,我们来判断一下能否用二维前缀和来写。

发现x, y <= 32000,使用前缀和的话时间复杂度就是32000 * 32000,十个亿左右,很显然会超时。

随后我们来尝试一下优化,可以发现n是相对来说比较少的,所以可以使用离散化进行优化,优化后就变为了log(n) * n ^ n

时间复杂度还是很高啊,而且空间也装不下这么大的数组,所以我们pass二维前缀和

我们考虑前缀和的在线升级版——树状数组

树状数组的话我们肯定不能使用二维的,但是我们可以根据树状数组的特性,可以动态的处理前缀和

具体思路是什么呢?大概就是我们按照x从大到小排序,随后按照顺序插入数据,这样就只需要y方向的前缀和就好了。

注意:这道题的限时0.2,所以我们不仅需要树状数组,还需要离散化优化


代码

#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#define s second
#define f first
​
using namespace std;
const int H = 32010, N = 15010;
typedef pair<int, int> PII; //按照x排序,按照y插入
int n, x, y;
int tree[N];
int node[N];
vector<PII> vtr;
unordered_map<int, int> umap;
int lowbit(int x)
{return x & -x;
}
​
void insert(int i, int x)
{if(i >= N) return;   tree[i] += x;insert(i + lowbit(i), x);
}
​
int find(int i)
{if(i < 0) return 0;if(i == 0) return tree[0];return tree[i] + find(i - lowbit(i));
}
​
int main()
{scanf("%d", &n);int idx = 1;for(int i = 1; i <= n; i++){scanf("%d%d", &x, &y);vtr.push_back({x, y});if(!umap[y])umap[y] = idx++;}sort(vtr.begin(), vtr.end());for(auto x : vtr){node[find(umap[x.s])]++;insert(umap[x.s], 1);}for(int i = 0; i < n; i++)printf("%d\n", node[i]);return 0;
}

星空之夜


分析

这道题是一道哈希的题目,这种题属于没有见过很难想到,但是见过了就会感觉不过如此的题目。

在讲正解之前,主播先讲一种模糊哈希的写法,虽然不能通过所有测试点,但是绝对可以通过绝大多数的测试点。

如果赛时忘记了正解可以从尝试用这种思路来写,和正解大差不差。

我们观察到题目是对方向,镜像不敏感的,那么我们就可以使用两种哈希方式——一种哈希方式是求任意两个点的距离和(浮点数),另外一种哈希方式是求每个点到中心的距离之和(同样是浮点数),因为我们要避开坐标的影响,所以要使用这种相对距离的方式。

这两种哈希的筛选程度的逐层递增的,第一种可以筛掉95%的情况,第二种可以筛掉99%的情况,接下来主播就把这两种哈希写到一起的代码展示出来。

/*dfs + 哈希哈希方式是求每个点到中心的距离之和(浮点数)首先dfs求每个连通块的质心,随后第二次dfs求出每个点的哈希
*/
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<unordered_map>
#define s second
#define f first
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
const double INF = 1e-6;
int n, m;
char map[N][N];
bool read[N][N];
PII s[] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
unordered_map<double, char> ha;
char q = 'a'; //编号
​
void dfs(int x, int y, vector<PII>& vtr, char z)
{map[x][y] = z;read[x][y] = true;vtr.push_back({x, y});for(int i = 0; i < 8; i++){int a = x + s[i].f, b = y + s[i].s;if(map[a][b] == '1' && !read[a][b])dfs(a, b, vtr, z);} 
}
​
int main()
{scanf("%d%d", &m, &n);for(int i = 1; i <= n; i++)scanf("%s", map[i] + 1);/*if(m == 7 && n == 5){printf("aa00bb0\n0a000b0\naa000bb\naaa0bbb\n00a000b");return 0;}*/// dfs求连通块和哈希值for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++){if(map[i][j] == '1' && !read[i][j]){vector<PII> vtr;memset(read, 0, sizeof read);dfs(i, j, vtr, '1');double x = 0, y = 0;for(int k = 0; k < vtr.size(); k++)x += vtr[k].f, y += vtr[k].s;x /= vtr.size();y /= vtr.size(); //求出质心//构造哈希哈希值double l = 0.0;// 一次哈希for(int k = 0; k < vtr.size(); k++)l += sqrt((vtr[k].f - x) * (vtr[k].f - x) + (vtr[k].s - y) * (vtr[k].s - y));// 二次哈希for(int i = 0; i < vtr.size(); i++)for(int j = 0; j < i; j++){double x = vtr[i].f  - vtr[j].f, y = vtr[i].s - vtr[j].s;l += sqrt(x * x + y * y);}bool b = false;memset(read, 0, sizeof read);for(auto x : ha){if(abs(x.f - l) < INF){dfs(i, j, vtr, x.s);b = true;break;}}if(!b){ha[l] = q++;dfs(i, j, vtr, ha[l]);}}            }for(int i = 1; i <= n; i++)printf("%s\n", map[i] + 1);return 0;
}

但是上面的两种哈希方式都很难处理那种只有细小差距的矩形,比如:

1100110
0100010
1100011
1110111
0010001

所以我们需要清晰匹配的方式,如何来写呢?

代码也是请教学长得来的,大致思路就是先求出连通块,随后将连通块八种情况的形态都计算出来,最后将八种情况排序,取任意一种作为哈希值存储起来。


代码

#include<iostream>
#include<map>
#include<algorithm>
#include<vector>
#define s second
#define f first
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
int n, m;
char mp[N][N];
bool st[N][N]; //存储每个位置有没有被读到
PII s[] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 1}};
map<vector<PII>, char> umap;
​
void dfs(int x, int y, vector<PII>& vtr) //dfs取出连通块
{st[x][y] = true;vtr.push_back({x, y});for(int i = 0; i < 8; i++){int dx = x + s[i].f, dy = y + s[i].s;if(!st[dx][dy] && mp[dx][dy] == '1')dfs(dx, dy, vtr);}
}
​
vector<PII> swap_matrix(vector<PII>& vtr, int r) //翻转矩阵
{PII s[] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};vector<PII> swp;for(auto [x, y] : vtr){if(r > 3) swap(x, y); //翻转后进行swp.push_back({x * s[r % 4].f, y * s[r % 4].s});}return swp;
}
​
vector<PII> get_hash(vector<PII>& vtr)
{vector<vector<PII>> vtt;for(int r = 0; r < 8; r++) //8个方向{vector<PII> swp = swap_matrix(vtr, r);sort(swp.begin(), swp.end());int mxx = 1e9, mxy = 1e9;for(auto [x, y] : swp)mxx = min(mxx, x), mxy = min(mxy, y); //取最小值for(int i = 0; i < swp.size(); i++)swp[i].f -= mxx, swp[i].s -= mxy; //取相对坐标vtt.push_back(swp); //加入函数值}sort(vtt.begin(), vtt.end());return vtt[0]; //将首位作为哈希值
}
​
void solve()
{scanf("%d%d", &m, &n);for(int i = 1; i <= n; i++)scanf("%s", mp[i] + 1); //读取地图char a = 'a';for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(mp[i][j] == '1' && !st[i][j]){vector<PII> vtr;dfs(i, j, vtr);vector<PII> hash = get_hash(vtr); //获取哈希值if(umap.find(hash) == umap.end())umap[hash] = a++;char l = umap[hash];for(auto [x, y] : vtr)mp[x][y] = l;}}}for(int i = 1; i <= n; i++)printf("%s\n", mp[i] + 1);
}
int main()
{solve();return 0;
}

这个矩阵翻转的代码很巧妙,值得学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于银河麒麟桌面服务器操作系统的 DeepSeek本地化部署方法【详细自用版】

一、3种方式使用DeepSeek 1.本地部署 服务器操作系统环境进行,具体流程如下(桌面环境步骤相同): 本例所使用银河麒麟高级服务器操作系统版本信息: (1)安装ollama 方式一:按照ollama官网的下载指南,执行如下命令: curl -fsSL https://ollama.com/install.sh | sh方…

Python入门(7):Python序列结构-字典

字典Dictionary 字典(dictionary)和列表类似&#xff0c;也是可变序列&#xff0c;不过与列表不同&#xff0c;它是无序的可变序列&#xff0c;保存的为容是以“键-值对”的形式存放的。 Python 中的字典相当于 Java 或者 C中的 Map 对象。在C#中,就是Dictionary<TKey,TVa…

Flutter项目之构建打包分析

目录&#xff1a; 1、准备部分2、构建Android包2.1、配置修改部分2.2、编译打包 3、构建ios包3.1、配置修改部分3.2、编译打包 1、准备部分 2、构建Android包 2.1、配置修改部分 2.2、编译打包 执行flutter build apk命令进行打包。 3、构建ios包 3.1、配置修改部分 3.2、编译…

不用再付费~全网书源一键下载,实现阅读自由!!!

现在市面上有许多免费你看书的软件&#xff0c;但都软件内太多广告弹窗&#xff0c;这无疑是很烦&#xff0c;有事一不小心点进去就下载了软件&#xff0c;简直让人头大&#xff01; 如果你遇到这样的难题那么就应该看下本文~ 这是一款能一键将在线连载小说整合下载成标准格式&…

GCC RISCV 后端 -- GIMPLE IR 表示的一些理解

C/C源代码经过 GCC 解析&#xff08;Parse&#xff09;及转换后&#xff0c;通过 GIMPLE IR 予以表示&#xff08;Representation&#xff09;。其中&#xff0c;一个C/C源文件&#xff0c;通过 宏处理后&#xff0c;形成一个 转译单元&#xff08;Translation Unit&#xff09…

JAVA设计模式之适配器模式《太白金星有点烦》

太白金星握着月光凝成的鼠标&#xff0c;第108次检查南天门服务器的运行日志。这个刚从天枢院调来的三等仙官&#xff0c;此刻正盯着瑶池主机房里的青铜鼎发愁——鼎身上"天地同寿"的云纹间&#xff0c;漂浮着三界香火系统每分钟吞吐的十万条功德数据。看着居高不下的…

以太坊DApp开发脚手架:Scaffold-ETH 2 详细介绍与搭建教程

一、什么是Scaffold-ETH 2 Scaffold-ETH 2是一个开源的最新工具包&#xff0c;类似于脚手架。用于在以太坊区块链上构建去中心化应用程序 &#xff08;DApp&#xff09;。它旨在使开发人员更容易创建和部署智能合约&#xff0c;并构建与这些合约交互的用户界面。 Scaffold-ETH…

毕业设计:实现一个基于Python、Flask和OpenCV的人脸打卡Web系统(六)

毕业设计:实现一个基于Python、Flask和OpenCV的人脸打卡Web系统(六) Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” ,因为它使用简单的核心,…

第十一章 VGA显示图片(还不会)

FPGA至简设计实例 前言 一、项目背景 1. IP核概述 IP 核(Intellectual Property core)指的是知识产权核或知识产权模块,其是具有特定电路功能的硬件描述语言程序,在EDA技术开发中具有十分重要的地位。美国著名的Dataquest咨询公司将 半导体产业的IP定义为“用于ASIC或FPGA…

浙江大学公开课|第二季|从大模型、智能体到复杂AI应用系统的构建——以产业大脑为例

大家好&#xff0c;我是吾鳴。 前沿回顾 吾鳴之前给大家分享过浙江大学DeepSeek系列公开课第一季&#xff0c;第一季一共八讲&#xff0c;内容介绍丰富&#xff0c;内容之广&#xff0c;看完粉丝朋友直呼浙大良心。这八讲公开课名称分别是&#xff1a; 第一期&#xff08;上&…

Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式

以下是Spring AOP中为所有类型通知传递参数的完整示例&#xff0c;包含详细注释和参数传递方式&#xff1a; // 1. 目标类&#xff08;被增强的类&#xff09; package com.example;public class TargetService {public void doTask(String param) {System.out.println("…

【Git教程】将dev分支合并到master后,那么dev分支该如何处理

将 dev 合并到 master 后的分支状态与操作指南 1. 合并后的分支状态 dev 分支不会消失&#xff1a; Git 的 git merge 命令仅将 dev 的内容合并到 master&#xff0c;不会删除 dev 分支。合并后&#xff0c;dev 分支仍然存在&#xff0c;其历史记录和代码保持不变。 分支的 H…

【go】异常处理panic和recover

panic 和 recover 当然能触发程序宕机退出的&#xff0c;也可以是我们自己&#xff0c;比如经过检查判断&#xff0c;当前环境无法达到我们程序进行的预期条件时&#xff08;比如一个服务指定监听端口被其他程序占用&#xff09;&#xff0c;可以手动触发 panic&#xff0c;让…

CSS层叠顺序

介绍 在 CSS 中&#xff0c;元素的层叠顺序决定了当多个元素重叠时&#xff08;跟布局没有完全的关系&#xff0c;也就是说层叠顺序只会在几个叠放元素上进行比较&#xff0c;而不会改变布局&#xff09;&#xff0c;哪个元素显示在最上面&#xff0c;哪个元素显示在最下面。 …

数制——FPGA

1、定点数 定点数的三种表示方式&#xff1a; 原码&#xff1a;符号位 绝对值 表示方法 反码&#xff1a;正数的反码表示 与原码表示一致&#xff0c;负数的反码表示 除符号位&#xff0c;其他位全都取反 补码&#xff1a;正数的补码表示 与原码表示一致&#xff0c;负数的补码…

在用redis当中可能遇到的问题解决方案以及redis中的一些名词解释

在用redis当中可能遇到的问题解决方案以及redis中的一些名词解释 Redis篇一、缓存穿透&#xff1a;解决方案&#xff1a;缓存空数据布隆过滤器 二、缓存击穿解决方案互斥锁&#xff0c;强一致性&#xff0c;性能差&#xff0c;速度慢逻辑过期&#xff0c;数据不同步&#xff0c…

一文详解QT环境搭建:Windows使用CLion配置QT开发环境

在当今的软件开发领域&#xff0c;跨平台应用的需求日益增长&#xff0c;Qt作为一款流行的C图形用户界面库&#xff0c;因其强大的功能和易用性而备受开发者青睐。与此同时&#xff0c;CLion作为一款专为C/C打造的强大IDE&#xff0c;提供了丰富的特性和高效的编码体验。本文将…

【区块链安全 | 第二十四篇】单位和全局可用变量(二)

文章目录 单位和全局可用变量&#xff08;Units and Globally Available Variables&#xff09;特殊变量和函数1. 区块和交易属性2. ABI 编码和解码函数3. bytes 成员函数4. string 成员函数5. 错误处理6. 数学和加密函数7. 地址类型成员函数8. 与合约相关9. 类型信息 单位和全…

一种监控录像视频恢复的高效解决方案,从每一帧中寻找可能性

该软件旨在恢复从监控设备中删除或丢失的视频。该程序经过调整以处理大多数流行供应商的闭路电视系统中使用的专有格式&#xff0c;并通过智能重建引擎进行了增强&#xff0c;能够为监控记录提供任何通用解决方案都无法实现的恢复结果。如果不需要持续使用该软件&#xff0c;则…

网红指路机器人是否支持环境监测功能?

嘿呀&#xff0c;你可知道&#xff1f;如今的叁仟网红指路机器人那可太牛啦&#xff01;它们可不单单局限于为行人指明方向&#xff0c;还纷纷兼职当起了 “环境小卫士”&#xff0c;为咱们的城市生活注入了前所未有的超智能便利。就拿那个依托叁仟智慧杆打造的数智指路机器人来…