蓝桥杯训练day1
前缀和+差分
- 1.前缀和
- (1)3956. 截断数组
- (2)795. 前缀和
- (3)796. 子矩阵的和
- (4)1230. K倍区间
- (5)99. 激光炸弹
- 2.差分
- (1)797. 差分
- (2)差分矩阵
- (3)3729. 改变数组元素
- (4)100. 增减序列
1.前缀和
(1)3956. 截断数组
方法1:暴力
先用两个数组分别保存前缀和,后缀和。然后使用贪心思想来枚举后缀和的下标。
只有后缀和满足1/3的下标大于前缀和的下标,就加(具体看代码)过(19/22)数据
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;int n;
int a[N];
int pre[N];
int npre[N];
int h1[N], h2[N];
int cnt1, cnt2;
int sum = 0;
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];sum += a[i];}int part = sum / 3;pre[0] = 0; //pre[i]表示前i个数的总和,这里下标从1开始有意义for (int i = 1; i <= n; i++) //前缀和{pre[i] = pre[i - 1] + a[i];if (pre[i] == part)h1[++cnt1] = i;}npre[n] = a[n];if (npre[n] == part)h2[++cnt2] = n;for (int i = n - 1; i >= 1; i--) //后缀和{npre[i] = npre[i + 1] + a[i];if (npre[i] == part)h2[++cnt2] = i;}//如此一来,存储了第一部分的part值的下标(从小到大)//又存储了第二部分的part值的下标(从大到小)//固定第二部分的下标,然后找第一部分的下标(由于从小到大,如果第二部分的下标大于第一部分下标的,则第一部分剩下的下标个数等于//当前答案个数。//然后枚举第二部分的下标,反复即可int ans = 0; //记录答案while (cnt2){int r = h2[cnt2];int temp = cnt1; //第一部分的下标while (temp){if (r > h1[temp]+1) //可以分成三个部分{ans = ans + temp;break;}temp--;}cnt2--;}cout << ans << endl;return 0;}
方法2:动态规划
枚举第二部分的位置,然后找第一部分有多少分割方案。使用动态规划的技巧来减少计算
#include<iostream>
#include<cstring>
using namespace std;
const int N=100010;int n;
int cnt;
long long int ans=0;int pre[N];int main()
{cin>>n;int x;for(int i=1;i<=n;i++){cin>>x;pre[i]=pre[i-1]+x;}if(pre[n]%3){cout<<"0";return 0;}else{for(int i=2;i<=n-1;i++){if(pre[i-1]==pre[n]/3)cnt++;if(pre[i]==pre[n]/3*2)ans+=cnt;}}cout<<ans;return 0;
}
(2)795. 前缀和
前缀和最简单的题目,模板题
用一个数组来记录前i个元素的和.
#include<iostream>
#include<cstring>
using namespace std;const int N=100010;int n,m;
int a[N];
int pre[N];int main()
{cin>>n>>m;for(int i=1;i<=n;i++) //下标从1开始{cin>>a[i];pre[i]=pre[i-1]+a[i];}while(m--){int l,r;cin>>l>>r;cout<<pre[r]-pre[l-1]<<endl; //注意是pre[l-1],要包括a[l]那个数}return 0;
}
(3)796. 子矩阵的和
二维前缀和,
模拟过程,然后优化,反复几次即可掌握
#include<iostream>
using namespace std;const int N=1010;int g[N][N]; //矩阵
int pre[N][N]; //左上角为(1,1),右下角是(i,j)的矩阵的和int n,m,q;int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>g[i][j];pre[i][j]=pre[i][j-1]+pre[i-1][j]-pre[i-1][j-1]+g[i][j];}while(q--){int x1,x2,y1,y2;cin>>x1>>y1>>x2>>y2;cout<<pre[x2][y2]-pre[x1-1][y2]-pre[x2][y1-1]+pre[x1-1][y1-1]<<endl;}return 0;
}
(4)1230. K倍区间
这个题目,看的第一感觉应该是个简单题,没想到是个中等题,暴力只能过一半数据。
暴力:
#include<iostream>
#include<cstring>
using namespace std;const int N=1e5+10;int n,k;int a[N];
int pre[N];
int ans=0;int main()
{cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];a[i]%=k;pre[i]=pre[i-1]+a[i];}for(int i=1;i<=n;i++){int temp=0;for(int j=i;j<=n;j++){temp+=a[j];if(temp%k==0)ans++;}}cout<<ans;return 0;
}
想到
pre[r]-pre[l-1]=k
pre[r[=pre[l-1]+k
用pre[r]作为key,r作为key存储到哈希表,没想到也只多过一个数据
#include<iostream>
#include<cstring>
#include<unordered_map>
#include<vector>
using namespace std;const int N=1e5+10;int n,k;int a[N];
int pre[N];
int ans=0;int main()
{cin>>n>>k;unordered_map<int,vector<int>>Hash;for(int i=1;i<=n;i++){cin>>a[i];pre[i]=(pre[i-1]+a[i])%k;Hash[pre[i]].push_back(i);}//利用前缀和for(int i=1;i<=n;i++){if(Hash.count((pre[i-1]+k)%k)!=0) //找到区间{vector<int>t=Hash[(pre[i-1]+k)%k];for(int j=0;j<t.size();j++){if(i<=t[j]){ans+=t.size()-j;break;}}}}cout<<ans;return 0;
}
看了题解,发现距离答案一步之遥。在于
pre[r]-pre[l-1]=k等价于 pre[r]%k=pre[l-1]%k
所以找到两个前缀和相同的就好了,再利用一点动态规划的技巧.
#include<iostream>
using namespace std;
const int N=100010;int a[N];
int pre[N];
int Hash[N];int n,k;int main()
{cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];pre[i]=(pre[i-1]+a[i])%k;}long long ans=0;Hash[0]=1; //由于对k取余,所以第一个元素可能就是kfor(int i=1;i<=n;i++) //从前往后遍历,到当前遍历到的点,前面有多少和他一样的值{ans+=Hash[pre[i]];Hash[pre[i]]++;}cout<<ans;return 0;}
(5)99. 激光炸弹
暴力
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N=5010;int n,r;
int pre[N][N];int main()
{cin>>n>>r; //n表示目标点个数,r表示炸弹的范围r = min(r, 5001);while(n--){int x,y,v;cin>>x>>y>>v;pre[x+1][y+1]+=v;}//前缀和for(int i=1;i<=5001;i++)for(int j=1;j<=5001;j++)pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+pre[i][j];int ans=0;//枚举右下角for(int i=r;i<=5001;i++){for(int j=r;j<=5001;j++)ans=max(ans,pre[i][j]-pre[i-r][j]-pre[i][j-r]+pre[i-r][j-r]);}cout<<ans;return 0;
}
2.差分
(1)797. 差分
什么是差分。
一句话:就是前缀和运输的逆运算.
#include<iostream>
#include<algorithm>
using namespace std;const int N=1e5+10;
int a[N];
int b[N];int n;
int T;int main()
{cin>>n>>T;for(int i=1;i<=n;i++) //相当于,b是原数组,a是b的前缀和{cin>>a[i];b[i]=a[i]-a[i-1];}while(T--){int l,r,c;cin>>l>>r>>c;b[l]+=c;b[r+1]-=c;}int sum=0;for(int i=1;i<=n;i++){sum+=b[i];cout<<sum<<" ";}return 0;
}
(2)差分矩阵
同二维前缀和一样,就是扩展一个维度(但是很难哦)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N=1010;int pre[N][N];
int a[N][N];int n,m,q;int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>pre[i][j];a[i][j]=pre[i][j]-pre[i-1][j]-pre[i][j-1]+pre[i-1][j-1];}while(q--){int x1,x2,y1,y2,c;cin>>x1>>y1>>x2>>y2>>c;a[x1][y1]+=c;a[x1][y2+1]-=c;a[x2+1][y1]-=c;a[x2+1][y2+1]+=c;}int sum=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j];cout<<pre[i][j]<<" ";if(j==m)cout<<endl;}return 0;
}
(3)3729. 改变数组元素
说实话,这个题目放在差分下面,完全不知道和差分有什么关系。
就从后往前读一遍看看哪些位置可以为1就可以了,应该是个简单到不能再简单的题,,,
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;const int N=2*(1e5+10);
int a[N]; //操作数组
int b[N]; //答案数组
int T,n;//假设两个数组a,b,a是原数组,b是a的前缀和数组。
//那么a是b的差分,b是a的原数组int main()
{cin>>T;while(T--){memset(b,0,sizeof b);cin>>n;for(int i=1;i<=n;i++)cin>>a[i];int cnt=a[n];for(int i=n;i>=1;i--){cnt=max(cnt,a[i]);if(cnt>=1){b[i]=1;cnt--;}}for(int i=1;i<=n;i++)cout<<b[i]<<" ";cout<<endl;}return 0;
}
(4)100. 增减序列
这个题目难啊,由于所有的数都要一样,所有差分数组必须除了第一个数其余全是0.由于差分数组每次操作都需要b[L]+1,b[R+1]-1或b[L]-1,b[R+1]+1.所以将正数和负数相互抵消后,剩下的数要么和b[1]抵消,要么和b[n+1]抵消。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N=1e5+10;long long int a[N];
long long int b[N];int n;int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];b[i]=a[i]-a[i-1];}long long int c1=0,c2=0; //c1记录正数和,c2记录负数和for(int i=2;i<=n;i++){if(b[i]>=0)c1+=b[i];else c2+=b[i];}long long int ans=min(abs(c1),abs(c2))+abs(abs(c1)-abs(c2)); //操作个数long long int count=abs(abs(c1)-abs(c2))+1;cout<<ans<<endl<<count<<endl;return 0;
}
相关文章:

蓝桥杯训练day1
前缀和差分1.前缀和(1)3956. 截断数组(2)795. 前缀和(3)796. 子矩阵的和(4)1230. K倍区间(5)99. 激光炸弹2.差分(1)797. 差分(2)差分矩阵(3)3729. 改变数组元素(4)100. 增减序列1.前缀和 (1)3956. 截断数组 方法1:暴力 先用两个数组分别保存前缀和,后缀…...

Unity毛发系统TressFX Exporter
Unity 数字人交流群:296041238 一:在Maya下的TressFX Exporter 插件安装步骤: 1. 下载Maya的TressFX Exporter插件 下载地址:TressFX Exporter 链接:https://github.com/Unity-China/cn.unity.hairfx.core/tree/m…...

《爆肝整理》保姆级系列教程python接口自动化(十九)--Json 数据处理---实战(详解)
简介 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下。首先捋一下思路,然后根据思路一步一步的去实现和实战,不要一开始就盲目的动手和无头苍蝇一样到处乱撞,撞得头破血流后而放弃了。不仅什么…...
Golang:reflect反射的使用例子
1.reflect包作用 reflect包定义了“反射”相关能力,“反射”在计算机学中是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。基于反射特性可以通用化地解决一些需要频繁修改代码及硬编码问题,但是…...

markdown常用语法--花括号(超详细)
💌 所属专栏:【Markdown常用语法】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! …...

BN、SyncBN、IN、LN、GN学习记录
1 BatchNormBN的原理BN是计算机视觉最常用的标准化方法,它沿着N、H、W维度对输入特征图求均值和方差,随后再利用均值和方差来归一化特征图。计算过程如下图所示,1)沿着通道维度计算其他维度的均值;2)沿着通…...
使用 Auto-scheduling 优化算子
本篇回答来源于 TVM 官方英文文档 Lianmin Zheng,Chengfan Jia。更多 TVM 中文文档可访问→https://tvm.hyper.ai/ 本教程将展示 TVM 的 Auto Scheduling 功能,如何在不编写自定义模板的情况下,找到最佳 schedule。 与基于模板的 AutoTVM 依…...

智能运维应用之道,告别企业数字化转型危机
面临的问题及挑战 数据中心发展历程 2000 年中国数据中心始建,至今已经历以下 3 大阶段。早期:离散型数据中心 IT 因以项目建设为导向,故缺乏规划且无专门运维管理体系,此外,开发建设完的项目均是独立运维维护&#…...
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
文章目录第七章 SQL错误信息 - SQL错误代码 -400 到 -500SQL错误代码和消息表WinSock错误代码-10050到-11002第七章 SQL错误信息 - SQL错误代码 -400 到 -500 SQL错误代码和消息表 错误代码描述-400发生严重错误-401严重连接错误-402用户名/密码无效-405无法从通信设备读取-4…...

DDFN: Decoupled Dynamic Filter Networks解耦的动态卷积
一、论文信息 论文名称:Decoupled Dynamic Filter Networks 论文:https://thefoxofsky.github.io/files/ddf.pdf 代码:https://github.com/theFoxofSky/ddfnet 主页:https://thefoxofsky.github.io/project_pages/ddf 作者团…...
NISP认证报名条件是什么?考试内容是什么?
科学技术是社会发展的第一生产力,每个国家为了能够获得更高的国际地位,不断提升自己的科学技术,现代最为先进的技术就是信息通信,在军事、民生、医疗、教育、制造等等领域都起着重要的作用,我们的生活也因为信息技术而…...

利用redis实现缓存、发布订阅、分布式锁功能
Redis是一个内存键值存储数据库,通常用于缓存、会话管理、消息队列等场景。以下是一些常见的Redis使用场景:1.缓存:将常用的数据缓存在Redis中,以减少对数据库的访问次数,提高应用程序的性能。2.会话管理:使…...

SVN无法连接到服务器的各种问题原因及解决办法
SVN专业使用教程详解 第一节 安装VisualSVN Server服务器 第一步 下载SVN服务器,需要链接的请私信。 点击下载的执行文档进行安装 选择组件 选择在部署 VisualSVN Server 时安装VisualSVN Server 和 Administration Tools 组件。 调整初始服务器配置 或者&…...
React 基本使用
目录 React 安装 React基本使用 React脚手架 脚手架使用React JSX基本使用 JSX列表渲染 JSX条件渲染 JSX模板精简 JSX样式控制 JSX综合案例 React 安装 npm i react react-domnpm init -y(生成基础目录文件) <!-- 引入js文件 --><sc…...

单例模式设计(面试题)
1、static修饰变量规则static修饰的静态成员属于 类而不是对象,所有的对象共享一份静态成员数据,所以不占用类的空间static修饰的成员,定义类的时候,必须分配空间static修饰的静态成员数据 必须类中定义 类外初始化静态成员变量可…...

机器学习:基于支持向量机(SVM)进行人脸识别预测
机器学习:基于支持向量机(SVM)进行人脸识别预测 文章目录机器学习:基于支持向量机(SVM)进行人脸识别预测一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.准备数据2.业务理解3.数据理解4.数…...

【服务器数据恢复】多块磁盘离线导致RAIDZ崩溃的数据恢复案例
服务器数据恢复环境: SUN ZFS系列某型号存储阵列; 40块磁盘组建的存储池(其中4块磁盘用作全局热备盘),池内划分出若干空间映射到服务器使用; 服务器使用Windows操作系统。 服务器故障: 服务器在…...

iconfont 图标如何在uniapp中的tabBar使用
注意: 小程序并不支持tabBar中 设置 iconfont 1. 材料准备 首先进入字体图标网址:iconfont-阿里巴巴矢量图标库;(如果你没有登入,记得登入一下) 把图标添加入购物车 添加到购物车之后-(右上角…...

第六章.卷积神经网络(CNN)—卷积层(Convolution)池化层(Pooling)
第六章.卷积神经网络(CNN) 6.1 卷积层(Convolution)&池化层(Pooling) 1.整体结构 以5层神经网络的实现为例: 1).基于全连接层(Affine)的网络 全连接层:相邻层的所有神经元之间都有连接 2).常见的CNN的网络 3).全连接层存在的问题 数据的形状容易被…...

c/c++开发,无可避免的模板编程实践(篇六)
一、泛型算法 1.1 泛型算法概述 c标准库不仅包含数据结构(容器、容器适配器等),还有很多算法。数据结构可以帮助存放特定情况下需要保存的数据,而算法则会将数据结构中存储的数据进行变换。标准库没有给容器添加大量的功能函数&am…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...