备战蓝桥杯(前缀和、差分篇)

Acwing 562.壁画

题目大意:
墙壁为一行, n n n个格子,每个时刻开始,先涂染料,再崩坏,涂过染料的格子不会崩坏,并且涂格子只能涂相邻未涂过的。

解题思路:
因为是先涂染料,所以最终涂过的格子数为 ( n + 1 ) / 2 (n+1)/2 (n+1)/2,然后求长度为 ( n + 1 ) / 2 (n+1)/2 (n+1)/2的连续长度最大值即可。
AC代码:时间复杂度为 O ( N ) O(N) O(N)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[5001000];
void solve(){int n;string x;cin>>n;cin>>x;for(int i=1;i<=n;i++){a[i]=x[i-1]-'0';a[i]+=a[i-1];}int sum=0;int k=(n+1)/2;for(int i=k;i<=n;i++){sum=max(a[i]-a[i-k],sum);}cout<<sum<<endl;return ;
}
signed main(){int t;cin>>t;for(int i=1;i<=t;i++){cout<<"Case #"<<i<<": ";solve();}return 0;
}

AcWing 1230. K倍区间

题目大意:
给定一个长度为 N N N的数列, A 1 , A 2 , … A N A1,A2,…AN A1,A2,AN,如果其中一段连续的子序列 A i , A i + 1 , … A j Ai,Ai+1,…Aj Ai,Ai+1,Aj
之和是 K K K的倍数,我们就称这个区间 [ i , j ] [i,j] [i,j] K K K倍区间。你能求出数列中总共有多少个 K K K倍区间吗?

解题思路:
因为是求和为 K K K的倍数的区间,所以就相当于求 m o d K = = 0 modK==0 modK==0的区间个数,由公式 ( a [ i + j ] − a [ i ] ) m o d K = = 0 即等价于 a [ i + j ] m o d K = = a [ i ] m o d K (a[i+j]-a[i])modK==0即等价于a[i+j]modK==a[i]modK (a[i+j]a[i])modK==0即等价于a[i+j]modK==a[i]modK,那么我们只需在每个前缀和下找到它前面有多少个与它取模 K K K相等的数,累加即可。
AC代码:时间复杂度为 O ( N ) O(N) O(N)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int a[200100],dp[200100];
signed main(){int n,k,sum=0;cin>>n>>k;dp[0]=1;for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];sum+=dp[a[i]%k];dp[a[i]%k]++;}cout<<sum<<endl;return 0;
}

AcWing 1236. 递增三元组

题目大意:
给定三个整数数组

A = [ A 1 , A 2 , … A N ] , B = [ B 1 , B 2 , … B N ] , C = [ C 1 , C 2 , … C N ] , A=[A1,A2,…AN],B=[B1,B2,…BN],C=[C1,C2,…CN], A=[A1,A2,AN],B=[B1,B2,BN],C=[C1,C2,CN],
请你统计有多少个三元组 ( i , j , k ) (i,j,k) (i,j,k)
满足:

1 ≤ i , j , k ≤ N A i < B j < C k 1≤i,j,k≤N Ai<Bj<Ck 1i,j,kNAi<Bj<Ck

解题思路:
方法一:前缀和
既然要排序实现快速的查找A中小于B[i]的数的个数,可以将数组A中所有元素出现的次数存入一个哈希表中,因为数组中元素的范围只有 n 5 n^5 n5, 可以开一个大的数组 c n t a cnta cnta 作为哈希表。

在枚举 B B B中元素时,我们需要快速查找找小于 B [ i ] B[i] B[i]的所有元素的总数,只需要在枚举之前先将求出表中各数的前缀和即可。
AC代码: O ( N ) O(N) O(N)

//前缀和
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int A[N], B[N], C[N];
int cnta[N], cntc[N], sa[N], sc[N];int main() {int n;scanf("%d", &n);//获取数i在A中有cntc[i]个,并对cnt求前缀和safor(int i = 1; i <= n; ++i) {scanf("%d", &A[i]);cnta[++A[i]]++;}sa[0] = cnta[0];for(int i = 1; i < N; ++i) sa[i] = sa[i-1]+cnta[i];//B只读取即可for(int i = 1; i <= n; ++i) scanf("%d", &B[i]), B[i]++;//获取数i在C中有cntc[i]个,并对cnt求前缀和scfor(int i = 1; i <= n; ++i) {scanf("%d", &C[i]);cntc[++C[i]]++;}sc[0] = cntc[0];for(int i = 1; i < N; ++i) sc[i] = sc[i-1]+cntc[i]; //遍历B求解LL ans = 0;for(int i = 1; i <= n; ++i) {int b = B[i];ans += (LL)sa[b-1] * (sc[N-1] - sc[b]);}cout<<ans<<endl;return 0;
}

方法二:二分法
既然是查找,那么可以考虑进行二分查找,查找前先通过排序预处理三个数组,排序时间复杂 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)枚举B的所有元素+查找A,C中的元素时间复杂度也是 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)总的时间复杂度降为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n).
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[3][200100];
signed main(){int n;cin>>n;for(int i=0;i<3;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}for(int i=0;i<3;i++){sort(a[i]+1,a[i]+1+n);}int sum=0;for(int i=1;i<=n;i++){int k=a[1][i];int l=lower_bound(a[0]+1,a[0]+n+1,k)-a[0]-1;int r=upper_bound(a[2]+1,a[2]+n+1,k)-a[2];if(l>0&&r<n+1){sum+=(n-r+1)*l;}}cout<<sum<<endl;return 0;
}

AcWing 99. 激光炸弹

题目大意:
地图上有 N N N个目标点,用整数 X i , Y i Xi,Yi Xi,Yi
表示目标在地图上的位置,每个目标都有一个价值 W i Wi Wi
注意:不同目标可能在同一位置。现在有一种新型的激光炸弹,可以摧毁一个包含 R × R R×R R×R个位置的正方形内的所有目标。
激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个正方形的边必须和 x , y x,y x,y轴平行。求一颗炸弹最多能炸掉地图上总价值为多少的目标。

解题思路:
固定区间的二维前缀和,扫一遍就可以了,但是要注意内存限制,只能开一个数组。
AC代码: O ( 5001 ∗ 5001 ) O(5001*5001) O(50015001)

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int a[5010][5010];
signed main(){IOSint n,r,x,y,w;cin>>n>>r;for(int i=1;i<=n;i++){cin>>x>>y>>w;a[x+1][y+1]+=w;}r=min(r,5001);for(int i=1;i<=5001;i++){for(int j=1;j<=5001;j++){a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];}}int maxx=0;for(int i=r;i<=5001;i++){for(int j=r;j<=5001;j++){maxx=max(maxx,a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r]);}}cout<<maxx<<endl;return 0;
}

AcWing 4262. 空调

题目大意:
给你两个序列A和B,可以对B序列进行操作,操作类型为:将B序列中任意长度的一段加1或者减一,最终使两序列相等,求最小操作次数。

解题思路:
先求出两序列的差值数组,再分别对该数组大于零和小于零的绝对值分别累加,取最大值即可。

AC代码: O ( N ) O(N) O(N)

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100],b[200100]; 
void solve(){int n,sum=0,num=0; cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){cin>>b[i];b[i]=a[i]-b[i];}for(int i=1;i<=n;i++){sum+=max(b[i]-b[i-1],0ll);num-=min(b[i]-b[i-1],0ll);}cout<<max(sum,num)<<endl;return ;
}
signed main()
{IOSint t=1;//cin>>t;while(t--)solve();return 0;
}

AcWing 797. 差分

模板题,先对区间进行 m m m次加减,然后再输出操作后的序列
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100],b[200100]; 
void solve(){int n,m,l,r,w; cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}while(m--){cin>>l>>r>>w;b[l]+=w;b[r+1]-=w;}for(int i=1;i<=n;i++){b[i]+=b[i-1];cout<<a[i]+b[i]<<" ";}cout<<endl;return ;
}
signed main()
{IOSint t=1;//cin>>t;while(t--)solve();return 0;
}

AcWing 798. 差分矩阵

同样是模板题,二维差分,和上一题类似
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[1500][1500],b[1500][1500]; 
void solve(){int n,m,q,x1,x2,y1,y2,w; cin>>n>>m>>q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j]; }}while(q--){cin>>x1>>y1>>x2>>y2>>w;b[x1][y1]+=w;b[x1][y2+1]-=w;b[x2+1][y1]-=w;b[x2+1][y2+1]+=w;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){b[i][j]+=b[i][j-1]+b[i-1][j]-b[i-1][j-1];cout<<a[i][j]+b[i][j]<<" ";}cout<<endl;}return ;
}
signed main()
{IOSint t=1;//cin>>t;while(t--)solve();return 0;
}

AcWing 5396. 棋盘

题目大意:
小蓝拥有 n × n n×n n×n大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m m m次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。输出所有操作做完后棋盘上每个棋子的颜色。

解题思路:
因为每次操作只会变黑或者变白,所以只需差分标记操作次数,最后前缀和一下,对于每个格子的操作数,是奇数则输出1,偶数则输出0.

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[2500][2500]; 
void solve(){int n,m,x1,x2,y1,y2,w=1; cin>>n>>m;while(m--){cin>>x1>>y1>>x2>>y2;a[x1][y1]+=w;a[x1][y2+1]-=w;a[x2+1][y1]-=w;a[x2+1][y2+1]+=w;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];if(a[i][j]%2){cout<<"1";}else{cout<<"0";}}cout<<endl;}return ;
}
signed main()
{IOSint t=1;//cin>>t;while(t--)solve();return 0;
}

AcWing 4655. 重新排序

题目大意:
给定一个数组 A A A 和一些查询 L i , R i Li,Ri Li,Ri,求数组中第 L i Li Li
至第 R i Ri Ri 个元素之和。小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?

解题思路:
先根据查询操作造差分数组,同时记录原操作的和,再对其求前缀和,然后分别对原数组和差分数组进行排序,用最大的数乘以最大的操作数,以此类推求和,最后用排过序的和减去原来的和即为所求。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[100100],b[100100],c[100100]; 
void solve(){int n,m,l,r,sum=0,num=0; cin>>n;for(int i=1;i<=n;i++){cin>>a[i];c[i]=a[i]+c[i-1];}cin>>m;while(m--){cin>>l>>r;b[l]++;b[r+1]--;sum+=c[r]-c[l-1];}for(int i=1;i<=n;i++){b[i]+=b[i-1];}sort(b+1,b+1+n);sort(a+1,a+1+n);for(int i=n;i>0;i--){num+=b[i]*a[i];}cout<<num-sum<<endl;return ;
}
signed main()
{IOSint t=1;//cin>>t;while(t--)solve();return 0;
}

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

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

相关文章

Tomcat 下载以及安装

Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;首先确认自己是否已经安装JDK 1. cmd&#xff1a;查看java的版本 步骤二&#xff1a;下载安装Tomcat 1. 下载tomcat :Apache Tomcat - Welcome! 2. 选择对应的tomcat版本&#xff1a; 3. 进行安装&#…

Uibot6.0 (RPA财务机器人师资培训第3天 )财务招聘信息抓取机器人案例实战

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博…

鸿蒙一次开发,多端部署(十四)一多开发实例(短信)

本章从系统预置的应用中&#xff0c;选择短信应用作为典型的案例&#xff0c;从页面开发和工程结构的角度&#xff0c;介绍"一多"的具体实践。系统的产品形态在不断丰富中&#xff0c;当前主要有默认设备和平板两种产品形态&#xff0c;本章的具体实践也将围绕这两种…

ALPHA开发板中CAN硬件图

一. 简介 前面文章学习了 IMX6ULL芯片的 CAN总线协议&#xff0c;CAN传输速率。 本文来搜索 ALPHA开发板中CAN硬件原理图&#xff0c;以及CAN设备节点信息。这里主要是CAN控制器的驱动&#xff0c;属于IMX6ULL芯片内部的驱动&#xff0c;NXP官方已经写好。 CAN控制器的驱动…

使用Python抓取抖音直播间数据的简易指南【第152篇—抓取数据】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python抓取抖音直播间数据的简易指南 说明&#xff1a;本文已脱敏&#xff0c;隐去地址…

Keepalive与idle监测及性能优化

Keepalive 与 idle监测 Keepalive&#xff08;保活&#xff09;: Keepalive 是一种机制&#xff0c;通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息&#xff08;称为keepalive消息&#xff09;实现的。如果在预定时…

鸿蒙Harmony应用开发—ArkTS-if/else:条件渲染

ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…

算法-双指针

目录 1、双指针遍历分割:避免开空间&#xff0c;原地处理 2、快慢指针&#xff1a;循环条件下的判断 3、左右指针&#xff08;对撞指针&#xff09;&#xff1a;分析具有单调性&#xff0c;避免重复计算 双指针又分为双指针遍历分割&#xff0c;快慢指针和左右指针 1、双指…

【leetcode热题】 位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…

Linux安装Nginx及配置TCP负载均衡

目录 1、安装编译工具及库文件2、下载解压Nginx压缩包3、Ngnix配置Tcp负载均衡4、配置Ngnix的文件5、Nginx启动 1、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel2、下载解压Nginx压缩包 wget https://nginx.o…

5.7、【AI技术新纪元:Spring AI解码】Prompts

翻译: Spring AI 中的 Prompts 处理 Prompts 是指导 AI 模型生成特定输出的输入。这些 Prompts 的设计和措辞显著影响模型的响应。 在与 Spring AI 模型交互的最基础层面上,处理 Prompts 有点类似于在 Spring MVC 中管理“视图”。这涉及创建带有动态内容占位符的大量文本。…

游戏中线上已有功能迭代的兼容问题

在游戏开发过程中&#xff0c;难免会有对线上已有功能进行迭代优化的需求。站在后端的角度来看&#xff0c;难点在于&#xff0c;如何在保证不会影响到用户的前提下&#xff0c;顺利进行对功能的升级和优化。关键在于兼容。 兼容分为功能配置、代码、用户数据和接口的兼容性。…

rider下ef core迁移

新建数据库 create database mockstu新建web项目 安装Microsoft.EntityFrameworkCore.SqlServer包 设置连接字符串 新建model using MockStuWeb.Models.EnumTypes; using System.ComponentModel.DataAnnotations;namespace MockStuWeb.Models {/// <summary>/// 学生…

C程序编译、链接与项目构建

C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块 Make与CMake的联系与区别 摘要 本…

Golang-web开发好用的依赖库

读取配置库Viper 能够读取很多格式的配置文件&#xff0c;并帮我们格式化。 github文档地址 go get github.com/spf13/viper 日志记录Zap go get -u go.uber.org/zap zap 包提供快速、结构化、分级的日志记录。 文档地址

国内AI领域的新星:Kimi与GPT的较量,谁主沉浮?

近期&#xff0c;国产大型人工智能模型Kimi频繁成为众多行业领袖讨论的焦点。这些来自不同领域的专家和领袖们&#xff0c;似乎都在对Kimi的性能和能力给予高度评价。在这两年国产AI模型的快速发展中&#xff0c;尽管市场上涌现出了许多新面孔&#xff0c;但真正能够在技术和应…

LeetCode-热题100:79. 单词搜索

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注&#xff08;CTF题型&#xff09; PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…

索引设计原则与性能优化实践

索引设计原则与性能优化实践是数据库管理中的关键领域&#xff0c;旨在提升数据库查询和更新操作的效率。以下是几个核心的索引设计原则与相关的性能优化实践&#xff1a; 索引设计原则&#xff1a; 1. 唯一性索引 - 如果存在一个字段的值是唯一的&#xff08;例如身份证号、学…

动手学深度学习|notebook教程

D2L.AI&#xff5c;《动手学深度学习》Notebooks 目录 面向中文读者的能运行、可讨论的深度学习教科书 含 PyTorch、NumPy/MXNet、TensorFlow 和 PaddlePaddle 实现 被全球 70 多个国家 500 多所大学用于教学 github 下面是整理好的&#xff0c;可以直接运行的notebook 0 前…