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”课程中详细讲解实现整个过程。…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...