nefu暑假集训2 ST表 个人模板+例题汇总

news2024/9/28 7:28:20

前言:

  比较简单的一个算法了,原理相当于是用二进制优化的区间dp了,用于求一个区间的最大或最小值。其实这类问题一般用线段树就可以直接解决,但如果查询次数过多的话可能会超时,这时就是ST表出场的时候了,因为ST表是现预处理的,所以查询的操作时间复杂度为o(1)。

正文:

习题:

Problem:A :st表模版

#include<bits/stdc++.h>
using namespace std;
int dp[1000005][20];
int main(){
	int n,m,a;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&a);
		dp[i][0]=a;
	}
	int l=(int)(log(n)/log(2));
	for(int j=1;j<=l;j++){//预处理,dp[i,j]相当于从第i个数到第i+2^j个数的最大值(必须先j后i,与区间dp类似)。
		for(int i=1;i<=n;i++){
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);//状态转移方程(二分的方式)
		}
	}
	int x,y,p;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		p=(int)(log(y-x+1)/log(2));//p是最大能满足的2的幂次区间。
		printf("%d\n",max(dp[x][p],dp[y-(1<<p)+1][p]));//需要分别从左右两侧查询来得到最优答案
	}
	return 0;
}
Problem:B   速算比赛-ST表:

#include<bits/stdc++.h>
using namespace std;
int dp[100005][40],d[100005][40];
int main(){
	int n,k,a;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		scanf("%d",&a);
		dp[i][0]=a;d[i][0]=a;
	}
	int l=(int)(log(n)/log(2));
	for(int j=1;j<=l;j++){
		for(int i=1;i<=n-(1<<j)+1;i++){
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
			d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
		}
	}
	int x,y,p;
	for(int i=1;i+k-1<=n;i++){
		x=i;y=i+k-1;
		p=(int)(log(y-x+1)/log(2));
		printf("%d %d\n",max(dp[x][p],dp[y-(1<<p)+1][p]),min(d[x][p],d[y-(1<<p)+1][p]));
	}
	return 0;
}

和第一题类似,只不过还要求最小值,再开一个数组并计算即可。

Problem:C  奶牛排队-ST

第二题的求差版本。

Problem:D  选择客栈-st

#include<bits/stdc++.h>
using namespace std;
int n,k,p;
int co[200005],mo[200005];
int d[200005][55];long long ans;
void RMQ_init(){//ST表的创建模板
    for(int i=0;i<n;i++)
        d[i][0]=mo[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=0;i+(1<<j)-1<n;i++){
            d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        }
}
int RMQ_min(int L,int R){//区间最小值
    int k=0;
    while((1<<(k+1))<=R-L+1)
        k++;
    return min(d[L][k],d[R-(1<<k)+1][k]);     
}
 
void solve(int id){
    int pre=0,sum1=0,sum2=0;
    for(int i=0;i<n;i++)
        if(co[i]==id)
            sum1++;
    ans+=1ll*sum1*(sum1-1)/2;
    for(int i=0;i<n;i++)
        if(co[i]==id){
         
            if(!pre){
                pre=i;
                continue;
            }
            if(RMQ_min(pre,i)>p)
                sum2++;
            else{
                ans-=1ll*sum2*(sum2+1)/2;
                sum2=0;
            }
            pre=i;
        }
     
    if(sum2)
        ans-=1ll*sum2*(sum2+1)/2;
}
int main(){
    scanf("%d%d%d",&n,&k,&p);
    for(int i=0;i<n;i++)
        scanf("%d%d",&co[i],&mo[i]);
    RMQ_init();
    for(int i=0;i<k;i++){
        solve(i);
    }
    cout<<ans;
    return 0;
}

运用ST表的写法,不过网上还有其他更简单的写法,感兴趣可以去看看。

后记:

  这算是比较简单的一种数据吧。

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

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

相关文章

遗产系统 legacy system 的定义和演化策略

原始英语叫做legacy system&#xff0c;被国内翻译成了“遗产系统”。实际上&#xff0c;legacy system&#xff0c;可以翻译为遗留系统、旧系统、老系统。 下文部分摘自《遗产系统及其解决方案的综述》一论文。 遗产系统的定义 遗产系统是 “一个已经运行了很长时间的&…

【初学人工智能原理】【13】LSTM网络:自然语言处理实践

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 代码及工具箱 本专栏的代码和工具函数已经上传到GitHub&#xff1a;1571859588/xiaobai_AI: 零基础入门人工智能 (github.com)&#xff0c;可以找到对应课程的代码 正文 上节…

虹科技术|全新Linux环境PCAN驱动程序发布!CAN/CAN FD通信体验全面升级!

全新8.17.0版本的PCAN-Linux驱动程序正式发布&#xff0c;专为CAN和CAN FD接口量身打造。无论是CAN 2.0 a/b还是CAN FD的PCAN硬件产品&#xff0c;都能在我们的新驱动下“驰骋自如”。想要体验字符模式设备驱动接口&#xff08;chardev&#xff09;的便捷&#xff0c;还是Socke…

Navicat Lite导入为SQL,然后到服务器的SQLServer Management 里执行时,报各种错误,是文件的Encoding不一致导致的解决

1、好多时候&#xff0c;本地的操作系统与服务器的操作系统不一致&#xff0c;有的时候也是历史原因&#xff0c;我们不得不用老旧的版本的数据库&#xff0c;比如 SQLServer 2008R2的数据库系统。 2、然后本地因为操作系统是win11的&#xff0c;导致这个SQLServer 2008R2根本…

【自动化测试】处理页面加载元素过慢以及页面中存在frame框架页问题

在自动化测试中&#xff0c;处理页面加载元素过慢以及页面中存在frame框架页等问题&#xff0c;需要采用一些特定的策略和技术来确保测试的顺利进行。下面我将分别针对这两个问题给出一些解决方案&#xff1a; 1. 处理页面加载元素过慢的问题 1.1 等待机制 显式等待&#xf…

如何在Mac上使用VMware配置Windows虚拟机

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;VMware Fusion 目录​​​​​​​ 1.下载windows虚拟机arm文件 2.打开VMware并拖入刚刚下载完成的iso文件 3.导入完成 4.固件类型 5.选择加密 6.完成 7.默认安装 8.现在安装…

NC 反转字符串

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 写出一个程序…

《React Hooks:让你的组件更灵活》

前端开发中非常流行的React框架。React是一个用于构建用户界面的JavaScript库&#xff0c;尤其适用于构建复杂的单页应用。 React Hooks&#xff1a;让你的组件更灵活 React 是当今最受欢迎的前端 JavaScript 库之一&#xff0c;用于构建用户界面。自从 React 16.8 版本开始&a…

图表操作——图表保存为图片+多个图表批量保存为压缩包——js技能提升

使用场景&#xff1a; echarts图表&#xff1a;生成的柱状图/折线图/饼图等可以实现图表的导出&#xff0c;导出格式为一个图片。也可以支持多个图表同时导出为图片&#xff0c;以压缩包的形式下载下来。 下面介绍单个导出批量导出的具体用法&#xff1a; 1.单个导出功能——…

使用seamless-scroll-v3 实现无缝滚动,自动轮播平滑的滚动效果

安装&#xff1a;npm地址&#xff1a;https://www.npmjs.com/package/seamless-scroll-v3 yarn add seamless-scroll-v3# 或者使用 npm npm install seamless-scroll-v3# 或者使用 pnpm pnpm add seamless-scroll-v3 实现效果&#xff1a; template中的代码&#xff1a; <…

pmp证书为何会被骂?他真的就是个垃圾证书?

说是垃圾到不至于。 毕竟PMP证书今年被北京市列入急需紧缺专业人才人员名单&#xff01;同时可以在创新创业、社会保障、评价激励等方面得到优先支。 其次&#xff0c;证书&#xff0c;其内容可以夯实基础&#xff0c;理清一个项目从启动、执行到最后的收尾做ppt结案的整个流…

Leetcode Day13 双指针

392 判断一个str是不是另一个str的子序列(不用连续) class Solution:def isSubsequence(self, s: str, t: str) -> bool:if len(t) < len(s):return Falsel 0r 0while l < len(s):if s[l] t[r]:l 1r 1else:r 1if r > len(t):return l len(s)return True自己…

pdf.js如何支持base64的查看

1.pdf.js 作为一个查看在线阅读pdf的软件&#xff0c;常常被运用到前端开发中&#xff0c;但是如何让pdf支持base64的查看&#xff0c;这边就需要去进行修改一些代码了 这边我们就进行开发修改 首先去下载 https://mozilla.github.io/pdf.js/ 当然了&#xff0c;低版本的可以…

react-native框架下,集成字体并应用全局

一、存放字体文件 将自定义字体文件&#xff08;例如 .ttf 或 .otf 文件&#xff09;放入项目的 assets/fonts 目录中。如果没有这个目录&#xff0c;可以手动创建。 二、配置字体 在项目根目录下建一个文件&#xff1a;react-native.config.js&#xff0c;文件内容如下&…

数据类型6.2.1

c语言的变量要先定义&#xff0c;而且要用确定类型 c以后的语言 c jave更强调类型&#xff0c;对类型的检查更严格 JavaScript。Python。PHP不看重类型&#xff0c;甚至不需要事先定义 c语言的类型 整数 char &#xff0c; short&#xff0c; int…

【MATLAB源码-第257期】基于matlab的QPSK调制解调COSTAS环载波同步仿真,对比前后星座图,输出锁相环响应曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QPSK&#xff08;Quadrature Phase Shift Keying&#xff0c;正交相移键控&#xff09;调制是一种常见的数字调制方式。它通过将比特数据映射到四个相位状态上来传输信息。每个符号代表两个比特的数据&#xff0c;因此与BPSK…

map和set(C++)

1.关联式容器 关联式容器&#xff1a;内部储存的是key或者k-v模型的数据 k-v模型&#xff1a;键值对 在STL中&#xff0c;键值对实际就是一个泛型的类&#xff0c;pair---->first(key) second(value) 分类&#xff1a;从底层数据结构上 红黑树结构 &#xff1a; …

单击视角复位按钮,即可看到整个地球【mars3d】

1.需要设置下初始默认视角&#xff0c;地图属性参数里面得 scene: { center: { 这个需要拿到一个参数&#xff0c;可以在示例里面随便抓一个想要的右键获取下 拿到之后再设置下&#xff0c;参考代码之后&#xff0c;就可以单击视角复位按钮&#xff0c;就回到可以看到整个地球…

19050 牛牛打气球

### 思路 1. **输入读取**&#xff1a; - 读取 n&#xff0c;a 和 b。 - 读取每个气球的坚韧度。 2. **计算最少释放次数**&#xff1a; - 使用二分查找来确定最少的释放次数。 - 每次释放武器时&#xff0c;选择一个气球多承受 a 点伤害&#xff0c;其他气球承受…

最简洁!四步完成C#——opencv环境配置

一.创建C#环境 二.右键点击管理NuGet 三.下载opencv环境 四.测试写入 using OpenCvSharp 不保存就完成了配置啦