c++专题三

news/2025/2/7 18:51:44/文章来源:https://www.cnblogs.com/sssyyyqqq/p/18703099

C++专题三学习日记

stack(栈)

仅支持查询或删除最后一个加入的元素(栈顶元素)

函数名 功能 时间复杂度
top() 返回栈顶元素 O(1)
empty() 判断是否为空 O(1)
size() 返回元素个数 O(1)
push() 在栈顶插入元素 O(1)
pop() 删除栈顶元素 O(1)

queue(队列)

仅支持查询或删除第一个加入的元素(队首元素)

函数名 功能 时间复杂度
front() 返回队首元素 O(1)
back() 返回队尾元素 O(1)
empty() 判断是否为空 O(1)
size() 返回元素个数 O(1)
push() 在队尾插入元素 O(1)
pop() 删除队首元素 O(1)

priority_queue

优先队列 std::priority_queue 是一种堆,一般为二叉堆。

函数名 功能(默认大根堆) 时间复杂度
top() 返回最大元素 O(1)
empty() 判断是否为空 O(1)
size() 返回元素个数 O(1)
push() 插入元素 O(log n)
pop() 删除最大元素 O(log n)

priority_queue<int> a;//默认大根堆(从大到小排)

priority_queue<int,vector<int>,greater<int>> a;//小根堆(从小到大排)

ST表

倍增思想,需要预处理log_2和f[i][j]

预处理log_2:

int log_2[N];
log_2[1]=0;
for(int i=2;i<=n;i++){log_2[i]=log_2[i/2]+1;
}

预处理f[i][j]

int f[N][20];
for(int j=1;j<=20;j++){for(int i=1;i<=N;i++){f[i][j]=f[f[i][j-1]][j-1];  //借鉴国旗运动例题,具体情况具体分析}
}

例1):给定n个数,m个询问,对于每个询问了l,r,需要回答区间[l, r]中的最大值或最小值。

ST表基于倍增的思想,可以实现O(nlogn)下进行预处理,并在O(1)时间内回答每个询问。

此题中f[i][j]表示区间[i,i+(2^j)-1]的最大值

#include <bits/stdc++.h>
using namespace std;
const int N=5e6;
int smax[N][31],log_2[N];
int main(){int n,m;cin>>n>>m;log_2[1]=0;for(int i=2;i<=n;i++){log_2[i]=log_2[i/2]+1;//预处理log2}//也可以直接用以下函数计算log2,头文件为#include <cmath>//_lg(m):计算以2为底的对数,接受一个整数,返回一个整数//log2(m):计算以2为底的对数,接受一个参数(不一定要是整型),返回一个double、float 或for(int i=1;i<=n;i++){cin>>smax[i][0];//smax[i][0]即区间(i,i)的最大值,即i}for(int j=1;j<=log_2[n];j++){for(int i=1;i+(1<<j)-1<=n;i++){smax[i][j]=max(smax[i][j-1],smax[i+(1<<(j-1))][j-1]);}}int l,r;for(int i=1;i<=m;i++){cin>>l>>r;int s=log_2[r-l+1];cout<<max(smax[l][s],smax[r-(1<<s)+1][s])<<endl;}return 0;
}

做题日记

1.国旗计划

#include<bits/stdc++.h>
using namespace std;
const int N=2e6;
int n,m;
int ans[N];			//储存答案
int f[N][20];		//f[i][j]表示从i起跳,跳2^j区间后站的位置
struct node{int id;int l,r;
}s[N*2];					//化环为链,二倍链思想
bool paixu(node a,node b){return a.l<b.l;			//每个战士按左端点从小到大排
}
void solve(int k){int rr=s[k].l+m;int tt=1;				//表示已使用1个区间int p=k;for(int i=19;i>=0;i--){			//倒序遍历所有倍增级别,尝试尽可能多的跳跃,直到覆盖目标rrif(f[k][i]!=0&&s[f[k][i]].r<rr){		tt+=(1<<i);		//如果从当前区间k跳2^i步后,所到达的区间右端点仍然小于rr,则可以选择这一次跳跃,累加tt,更新kk=f[k][i];}}ans[s[p].id]=tt+1;
}
int main(){cin>>n>>m;int i;for(i=1;i<=n;i++){cin>>s[i].l>>s[i].r;if(s[i].r<s[i].l)s[i].r+=m;s[i].id=i;}sort(s+1,s+1+n,paixu);		//排序for(i=1;i<=n;i++){s[i+n]=s[i];s[i+n].l=s[i].l+m;s[i+n].r=s[i].r+m;}							//部署二倍链int p;for(i=1,p=i;i<=2*n;i++){while(p<=2*n&&s[p].l<=s[i].r){p++;}f[i][0]=p-1;			//找到每个战士对应的下一个战士,满足下一个战士的左端<=这个战士的右端}for(i=1;i<20;i++){for(int j=1;j<=2*n;j++){f[j][i]=f[f[j][i-1]][i-1];}}							//ST表,倍增for(i=1;i<=n;i++){solve(i);}for(i=1;i<=n;i++){cout<<ans[i]<<' ';}return 0;
}

2.约瑟夫环问题

#include<iostream>
#include<queue>
using namespace std;
int main(){int n,m;cin>>n>>m;queue<int> a;int i;for(i=1;i<=n;i++){a.push(i);}int id=0;while(!a.empty()){id++;int t=a.front();a.pop();			//弹出队首元素,符合条件就输出,不符合就再入队,变成队尾元素if(m==id){cout<<t<<' ';id=0;}elsea.push(t);}return 0;
}

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

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

相关文章

mower 明日方舟自动化脚本的docker镜像构建以及使用

一、前言碎碎念 由于我目前使用的arm开发板,默认没有启用桌面可视化环境,而且又不想装一大堆软件和包影响实机环境,所以使用docker进行mower的镜像构建以及使用 测试平台如下,x64和arm64平台均已经过构建以及使用测试二、mower构建以及部署过程 接下来使用arm平台ubuntu进行…

我的公众号接入AI了

背景 近期,DeepSeek等AI应用的爆火让我深刻意识到AI技术在各个领域中的巨大潜力。为了更好地拥抱AI,我决定在我的所有工作生活场景中尽可能地加入AI,以提升效率和体验。 作为拥抱AI的一环, 我选择了为我的微信公众号接入AI功能,使其能够智能回复用户消息,提供更丰富的交互…

大模型时代的软件进化论:恐龙式软件 vs. 猴群式软件

春节期间,IT圈内两件大事持续发酵,一件是中国大模型DeepSeek R1的开源震动全球AI界,让中国科技界扬眉吐气,廉价大模型走入千家万户;另一件是SAP被客户居然之家告上法庭,要求索赔590万开发费用和1700万软件费用,最终法院判SAP退还350万研发费用。这两件事的背后,实际上映…

xtrabackup 命令备份

Percona XtraBackup 安装下载地址: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-32/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.35-32.1.el8.x86_64.rpm 官方YUM安装说明: Percona 版本和 YUM - Percona XtraBackup在…

React—03—类组件中事件处理函数的this绑定、事件处理函数的传参;jsx的条件判断渲染;jsx的循环渲染

零、如何给html元素加事件监听 1.原生方式:通过querySelector()方法,捕捉到元素,比如说button元素,然后通过btn.onclick = () =>{}或者通过btn.addEventListensers(click, ()=>{})的方式 2.vue的方式,在元素上使用v-on指令,比如@click 3.react方式,在元素上使用事…

巧用通义灵码,提升前端研发效率

本次分享,主题是利用通义灵码提升前端研发效率。分享内容主要包括以下几部分:首先,我将从前端开发的角度介绍对通义灵码的基本认识;其次,我将展示通义灵码在日常研发中的应用案例;然后,我将通过实例说明,良好的设计能够显著提升通义灵码的效果。在第四个部分,我将介绍…

linux服务器离线安装ollama

一、前言 公司服务器在线安装ollama总是超时连接不上,想着本质就是个安装包,离线安装也可以。固有了这样的一篇博客记录一下。 二、流程 1、查看服务器cpu架构 执行指令 lscpu# x86_64 CPU选择下载ollama-linux-amd64 # aarch64|arm64 CPU选择下载ollama-linux-arm642、下载对…

数字孪生与智慧工厂完美融合,推动智能制造新时代

随着工业4.0和智能制造的浪潮席卷全球,数字孪生技术成为了现代工业发展的重要驱动力。数字孪生,作为一种能够在虚拟环境中精确再现物理实体的技术,通过实时数据的流动和反馈,创建了一个高度仿真的“数字模型”,而这一模型不仅仅停留在静态的模拟阶段,而是与现实世界保持实…

【字符串处理之sscanf函数】读入HH:MM:SS:NN型时间;读入日期

读取时间 HH:MM:SS:NN型 函数 //转为毫秒表示,方便比大小 int get(string time) {int h, m, s, ms;//从字符串内读数据sscanf(time.c_str(), "%d:%d:%d.%d", &h, &m, &s, &ms);return h * 3600000 + m * 60000 + s * 1000 + ms; }样例1 输入 3 23:4…

【字符串处理sscanf】读入HH:MM:SS:NN型时间

读取时间 HH:MM:SS:NN型 函数 //转为毫秒表示,方便比大小 int get(string time) {int h, m, s, ms;//从字符串内读数据sscanf(time.c_str(), "%d:%d:%d.%d", &h, &m, &s, &ms);return h * 3600000 + m * 60000 + s * 1000 + ms; }样例1 输入 3 23:4…

如何阅读一本书

明确自己阅读的目的扩充知识:期望扩充哪方面的知识呢 研究他人的方法论? 深挖某些知识点?当前看的内容是否合适? 应用方法论SQ3R 阅读法Survey (预览): 快速浏览标题、目录、摘要等,了解文章或书籍的大意。 Question (提问): 对内容提出问题,带着问题阅读能提高理解力。 …

【转载】在windows下vscode终端里无法运行脚本解决方案

windows下使用vscode中的终端运行脚本出现以下的问题解决方案: 以管理员身份打开vscode,任意打开一个终端 在终端中输入get-ExecutionPolicy,若返回Restricted,说明现在是vscode是被禁止运行脚本 输入set-ExecutionPolicy RemoteSigned 这段命令 再看看现在的状态,输入 ge…