C++知识点总结(55):时间优化
时间优化
- 一、调试方法
- 1. 输出调试
- 2. 构造样例
- 二、时间优化
- 1. 前缀和
- 1.1 概念
- 1.2 例题
- Ⅰ 区间最多数码
- Ⅱ 双字母字符串
- Ⅲ Wandering...
- Ⅳ 数对数目
- 2. 排序
- 例题
- 选择排序过程
一、调试方法
1. 输出调试
cout
是一个强大的调试工具,可以帮助我们查看程序的状态和变量的值。在调试过程中,可以使用 cout
来输出变量的值,以验证程序的正确性。(虽然是第一节课学的)
2. 构造样例
构造的样例包括下面的两种:
- 边界信息
- 特殊样例
这两种应该说是蹭分 debug 的一个工具,尤其注意分辨 continue
、break
、return 0;
。特殊样例一定要考虑极端情况。好吧,实在不行就打表
二、时间优化
1. 前缀和
1.1 概念
仅有两个元素的容斥关系如下:
∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A \cup B| = |A| + |B| - |A \cap B| ∣A∪B∣=∣A∣+∣B∣−∣A∩B∣
根据这一公式,我们可以求出二维前缀和的公式:
s i , j = s i − 1 , j + s i , j − 1 − s i − 1 , j − 1 + a i , j s_{i,j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+a_{i,j} si,j=si−1,j+si,j−1−si−1,j−1+ai,j
从而逆推出二维区间和公式:
s x 1 , y 1 ∼ x 2 , y 2 = s x 2 , y 2 − s x 1 − 1 , y 2 − s x 2 , y 1 − 1 + s x 1 − 1 , y 1 − 1 s_{x_1,y_1\sim x_2,y_2}=s_{x_2,y_2}-s_{x_1-1,y_2}-s_{x_2,y_1-1}+s_{x_1-1,y_1-1} sx1,y1∼x2,y2=sx2,y2−sx1−1,y2−sx2,y1−1+sx1−1,y1−1
1.2 例题
Ⅰ 区间最多数码
给定一个长度为 n n n 的数列 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an。小猴会对你进行 q q q 次询问,每次询问要求你计算出在区间 [ l , l + 1 , … , r ] [l,l+1,…,r] [l,l+1,…,r] 中出现次数最多的十进制数码是谁( 0 × 9 0\times 9 0×9 中的一个)以及该十进制数码出现了多少次,如果有多个数码出现次数相同,则选择数值最小的数码。
首先我们考虑暴力方法,大致代码如下:
memset(sum,0,sizeof(sum));
for(int i=l;i<=r;i++){int num=a[i];do{sum[num%10]++;num/=10;}while(num);
}
int ans,cnt=0;
for(int i=0;i<=9;i++)if(sum[i]>cnt){cnt=sum[i];ans=i;}
cout<<ans<<" "<<cnt<<endl;
这里新增加一个知识点 do-while结构,也就是先执行然后进行 while
循环条件的判断。这主要是因为 num
是 0 0 0 的时候也是需要统计 0 0 0 这个数码的。
所以,前缀和&桶 就这样登场了。
参考答案:
#include<bits/stdc++.h>
using namespace std;
int n,q,l,r,num;
int a[200010][10],s[200010][10];
int main(){cin>>n>>q;for(int i=1;i<=n;i++){cin>>num;do{a[i][num%10]++;num/=10;}while(num);}for(int i=1;i<=n;i++)for(int j=0;j<10;j++)s[i][j]=s[i-1][j]+a[i][j];while(q--){cin>>l>>r;int ans,cnt=0;for(int i=0;i<10;i++)if(s[r][i]-s[l-1][i]>cnt){cnt=s[r][i]-s[l-1][i];ans=i;}cout<<ans<<" "<<cnt<<endl;}return 0;
}
Ⅱ 双字母字符串
小猴正在挑战一个关于字符串的"简单题":给定 n n n 个只包含大小写字母的字符串,所有字符串的长度均为 2 2 2。要求在这 n n n 个字符串中找出任意两个字符串 s , t s,t s,t,使得 s , t s,t s,t 在不区分大小写的情况下有且只有一个位置上的字母相同,请问这样成对的字符串一共有多少对。
首先还是先上暴力:
#include<bits/stdc++.h>
using namespace std;
int t,n;
string a[100010];
int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];int cnt=0;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){int match=0;for(int k=0;k<2;k++)if(tolower(a[i][k])==tolower(a[j][k]))match++;if(match==1)cnt++;}cout<<cnt<<endl;}return 0;
}
接下来,上!技!巧!!
考虑两个数组来统计第一个字母和第二个字母的出现次数,以及一个 tot
数组统计每个字符串出现的个数。
#include<bits/stdc++.h>
using namespace std;
const int BYTE=256;
int t,n;
int fst[BYTE],scd[BYTE],tot[BYTE][BYTE];
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>t;while(t--){cin>>n;memset(fst,0,sizeof(fst));memset(scd,0,sizeof(scd));memset(tot,0,sizeof(tot));long long ans=0;for(int i=1;i<=n;i++){string s;cin>>s;s[0]=tolower(s[0]),s[1]=tolower(s[1]);ans+=fst[s[0]]+scd[s[1]]-tot[s[0]][s[1]]*2;fst[s[0]]++,scd[s[1]]++,tot[s[0]][s[1]]++;}cout<<ans<<endl;}return 0;
}
Ⅲ Wandering…
给出一个整数数列 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an,这个数列可能包含负数。一个机器人初始在数轴的坐标 0 0 0 点,按照以下流程移动:
向正方向移动 a 1 a_1 a1 单位长度。
向正方向移动 a 1 a_1 a1 单位长度,再向正方向移动 a 2 a_2 a2 单位长度。
⋯ \cdots ⋯
向正方向移动 a 1 a_1 a1 单位长度,再向正方向移动 a 2 a_2 a2 单位长度。
⋯ \cdots ⋯
最后向正方向移动 a n a_n an 单位长度。
你需要求出机器人在整个移动过程中,坐标的最大值。
参考代码(就这么短……)
#include<bits/stdc++.h>
using namespace std;
long long n,pos,ans;
long long a[200010],res[200010],maxOff[200010];
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];res[i]=res[i-1]+a[i];maxOff[i]=max(maxOff[i-1],res[i]);ans=max(ans,pos+maxOff[i]);pos+=res[i];}cout<<ans;return 0;
}
Ⅳ 数对数目
给出一个序列,求出其中满足 a i < i < a j < j a_i<i<a_j<j ai<i<aj<j 的个数( 1 ≤ i , j ≤ n 1\le i,j \le n 1≤i,j≤n)。
先暴力:
#include<bits/stdc++.h>
using namespace std;
long long n,cnt,a[2000010];
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int l=1;l<n;l++)for(int r=l+1;r<=n;r++)if(a[l]<l&&l<a[r]&&a[r]<r)cnt++;cout<<cnt;return 0;
}
前缀信息优化:单调性为 a[i]<i
#include<bits/stdc++.h>
using namespace std;
long long n,ans;
long long a[2000010],s[2000010];
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]+(a[i]<i);if(a[i]<i)ans+=s[a[i]-1];}cout<<ans;return 0;
}
2. 排序
例题
选择排序过程
还记得我们之前打的暴力:
#include <iostream>
#include <vector>
using namespace std;void selectionSort(vector<int>& A, int q) {int n = A.size();for (int i = 0; i < q; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (A[j] < A[minIndex]) {minIndex = j;}}swap(A[i], A[minIndex]);}
}int main() {int n, m;cin >> n >> m;vector<int> A(n);for (int i = 0; i < n; i++) {cin >> A[i];}for (int i = 0; i < m; i++) {int q;cin >> q;selectionSort(A, q);for (int j = 0; j < n; j++) {cout << A[j] << " ";}cout << endl;}return 0;
}
现在来优化。
#include<bits/stdc++.h>
using namespace std;
int n,m,iter,lmt;
int num[100010],num2idx[100010];
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>num[i];num2idx[num[i]]=i;}while(m--){cin>>lmt;while(iter<lmt){//iter永远是numiter++;int idx=num2idx[iter];swap(num[idx],num[iter]);num2idx[iter]=iter;num2idx[num[idx]]=idx;}for(int i=1;i<=n;i++)cout<<num[i]<<" ";cout<<endl;}return 0;
}
相关文章:
C++知识点总结(55):时间优化
时间优化 一、调试方法1. 输出调试2. 构造样例 二、时间优化1. 前缀和1.1 概念1.2 例题Ⅰ 区间最多数码Ⅱ 双字母字符串Ⅲ Wandering...Ⅳ 数对数目 2. 排序例题选择排序过程 一、调试方法 1. 输出调试 cout 是一个强大的调试工具,可以帮助我们查看程序的状态和变…...
GitHub每日最火火火项目(9.7)
项目名称:polarsource / polar 项目介绍:polar 是一个开源的项目,它是 Lemon Squeezy 的替代方案,具有更优惠的价格。该项目旨在让开发者能够凭借自己的热情进行编码并获得报酬。通过使用 polar,开发者可以更轻松地实现…...

11Python的Pandas:可视化
Pandas本身并没有直接的可视化功能,但它与其他Python库(如Matplotlib和Seaborn)无缝集成,允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法: 1. 使用Matplotlib Pandas中的plot()方法…...

【周易哲学】生辰八字入门讲解(二)
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解【周易哲学】生辰八字入门讲解,期待与你一同探索、学习、进步,一起卷起来叭! 目录 十神十神判断十神类象十神与五行案例 地支藏干藏…...

传统CV算法——基于Opencv的多目标追踪算法
基于 OpenCV 的跟踪算法有多种,每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法: 1. BOOSTING 跟踪器 描述:基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法,使用的是基于弱分类器的强…...
人生苦短我用Python excel转csv
人生苦短我用Python excel转csv 前言准备工作pandas库主要类和方法ExcelFile 类DataFrame 类read_excel 函数to_csv 函数 示例 前言 Excel 文件和csv文件都是常用的电子表格文件格式,其中csv格式更便于用于数据交换和处理。本文使用pandas库将Excel文件转化为csv文…...
Web2和Web3笔记
KimiAI: Web2和Web3是互联网发展的不同阶段,它们代表了不同的技术、理念和用户交互方式。 Web2: Web2通常指的是第二代互联网,它始于2000年代中期,以用户生成内容和社交网络的兴起为标志。 在Web2中,用户不仅是内容的消…...

单元测试 Mock不Mock?
文章目录 前言单元测试没必要?Mock不Mock?什么是Mock?Mock的意义何在? 如何Mock?应该Mock什么?Mock 编写示例 总结 前言 前段时间,我们团队就单元测试是否采用 Mock 进行了一番交流,各有各的说法。本文就单元测试 Mock不Mock…...

常用排序算法(上)
目录 前言: 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3 常见的排序算法 2.常见排序算法的实现 2.1 堆排序 2.1 1 向下调整算法 2.1 2 建堆 2.1 3 排序 2.2 插入排序 2.1.1基本思想: 2.1.2直接插入排序: 2.1.3 插…...
【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十六)
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
小程序的页面跳转方式
102. 小程序的页面跳转方式 小程序是一种快速发展的应用形式,为用户提供了便捷的功能和交互体验。其中,页面跳转是小程序中常用的功能之一,本文将介绍小程序的页面跳转方式,并提供代码示例,帮助读者更好地理解和实现页…...
第 21 章 DOM 操作表格及样式
第 21 章 DOM 操作表格及样式 1.操作表格 2.操作样式 DOM 在操作生成 HTML 上,还是比较简明的。不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了。本章主要了解一下 DOM 操作表格和样式的一些知识。 一࿰…...

vc-align源码分析 -- ant-design-vue系列
vc-align源码分析 源码地址:https://github.com/vueComponent/ant-design-vue/tree/main/components/vc-align 1 基础代码 1.1 名词约定 需要对齐的节点叫source,对齐的目标叫target。 1.2 props 提供了两个参数: align:对…...

计算机网络(四) —— 简单Tcp网络程序
目录 一,服务器初始化 1.0 部分文件代码 1.1 关于Tcp协议 1.2 创建和绑定套接字 1.3 监听 二,服务器启动 2.1 获取连接 2.2 提供服务 2.3 客户端启动源文件 Main.cc 二,客户端编写 2.1 关于Tcp客户端 2.2 客户端代码 2.3 效果…...

简单的Linux Ftp服务搭建
简单的Linux FTP服务搭建 1.需求 公司有一个esb文件传输代理,其中我们程序有文件传输功能,需要将本地文件传输到esb文件代理服务器上,传输成功之后发送http请求,告知esb将固定文件进行传输到对应外围其他服务的文件目录中&#…...

SQL的高级查询练习知识点(day24)
目录 1 学习目标 2 基础查询 2.1 语法 2.2 例子 3 条件查询 3.1 含义 3.2 语法 3.3 条件表达式 3.3.1 条件运算符 3.3.2 例子 3.4 逻辑表达式 3.4.1 逻辑运算符 3.4.2 例子 3.5 模糊查询 3.5.1 概述 3.5.2 例子 4 DISTINCT关键字 4.1 含义 4.2 例子 5 总结…...
Python条件表达式优化的10个实例
Python 中的条件表达式(也称为三元运算符)是一种简洁的语法,用于在单个表达式中执行 if-else 逻辑。虽然它们本身并不直接“优化”代码的执行速度,但它们可以使代码更加简洁、易读,并且有助于避免不必要的嵌套或复杂的…...

oatpp apiclient 客户端get,post请求python fastapi demo
最新用fastapi搞了个服务端,python功能太强了,就是环境不好弄,弄好后,不要轻易换python版本,不要装多个python版本 前面搞了个oatpp webapi服务端,现在要用客户端,为什么用opatpp客户端,因为他不再带其他库了 demo: 我的请求比较简单,就是向python 的 fastapi服务端…...
RK3568平台(内存篇)EMMC介绍
一.eMMC是什么 eMMC (Embedded Multi Media Card)是MMC协会订立、主要针对手机或平板电脑等产品的内嵌式存储器标准规格。由一个嵌入式存储解决方案组成,带有MMC(多媒体卡)接口、快闪存储器设备及主控制器。所有都在一个小型的BGA 封装。接口速度高达每秒52MBytes,eMMC具…...

Python批量读取身份证信息录入系统和重命名
前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...