简单RMQ模板题 POJ 3264
来源:互联网 发布:铃声大全 for mac 编辑:程序博客网 时间:2024/05/18 05:08
POJ 3264:http://poj.org/problem?id=3264
题意:给N个数,无序。接下来Q次询问,询问一个区间 [L,R] 内的最大值 和 最小值 的差为多少。
使用Sparse-Table 方法,最简单的RMQ了。预处理 O(nlogn),查询速度 O(1) 。
两次ST,一个维护最大值,一个维护最小值,相减就好了。
上代码:
#include "stdio.h"#include "cstring"#include "algorithm"using namespace std;#define inf 50009#define INF 999999999#define ll long long#define loop(x,y,z) for(x=y;x<z;x++)int max_d[inf][20];int min_d[inf][20];int a[inf];int n;void init_d(){ int i,j; loop(i,0,n)max_d[i][0]=min_d[i][0]=a[i]; for(j=1;(1<<j)<=n;j++) for(i=0;i+(1<<j)<=n;i++) { max_d[i][j]=max( max_d[i][j-1],max_d[i+(1<<(j-1))][j-1] ); min_d[i][j]=min( min_d[i][j-1],min_d[i+(1<<(j-1))][j-1] ); }}void init(){ memset(max_d,0,sizeof max_d); memset(min_d,0,sizeof min_d); init_d();}int query(int i,int j){ int k=0; while((1<<k)<=j-i+1)k++; k--; return max( max_d[i][k],max_d[j-(1<<k)+1][k] ) - min( min_d[i][k],min_d[j-(1<<k)+1][k] );}int main(){ int i,j,q; scanf("%d%d",&n,&q); loop(i,0,n)scanf("%d",&a[i]); init(); while(q--) { scanf("%d%d",&i,&j); printf("%d\n",query(i-1,j-1)); } return 0;}
阅读全文
0 0
- 简单RMQ模板题 POJ 3264
- poj 3264 -- RMQ模板题
- RMQ模板题 POJ 3264
- poj 3264(模板RMQ)
- POJ 3264 RMQ模板
- POJ 3264 【RMQ模板】
- POJ 3264 Balanced Lineup【RMQ模板题】
- POJ-3264 Balanced Lineup(rmq模板题)
- poj 3624 RMQ模板题
- poj 3264 Balanced Lineup--RMQ问题模板题
- (模板题)poj 3264 Balanced Lineup(RMQ的ST算法)
- poj 3264 Balanced Lineup (RMQ算法 模板题)
- POJ 3264 Balanced Lineup【RMQ附模板】
- POJ 3264 Balanced Lineup(RMQ模板)
- POJ 1330 LCA转RMQ模板题
- poj 3246 RMQ模板
- poj 3264 Balanced Lineup (简单 RMQ )
- POJ 3264 Balanced Lineup(简单的RMQ)
- 【算法】负载均衡
- layui初试用
- Jsp实现Cookie保存用户名和密码(包含:什么是Cookie,Cookie带来的好处,Cookie的主要方法)
- 常用集合运算符号
- oracle实用知识(一)
- 简单RMQ模板题 POJ 3264
- Java系列问题(一)
- win10查看电脑型号
- Composer 怎么用安装
- Web前端开发测试题
- RabbitMQ基础概念详细介绍
- 欢迎使用CSDN-markdown编辑器
- Composer 是什么
- 悲观锁