【USACO】 Balanced Lineup
【题目链接】
【算法】
这是一道经典的最值查询(RMQ)问题。
我们首先想到线段树。但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解。
稀疏表算法。其实也是一种动态规划的算法。是先做一遍预处理,然后O(1)求出答案。
设计状态 : f[i][j] 表示从第i个数开始连续2^j次方个数(包括第i个数),中的(最大或最小值)
那么状态转移方程是什么呢?
我们知道 2^j可分解为两个2^(j-1),所以f[i][j] = max或min(f[i][j-1],f[i+2^(j-1)][j-1])
做完预处理,我们又该如何查询呢?
首先我们证明 : 2^log(x) > x / 2
先将x表示为2^i+k的形式,则log(x)=i
得到: 2^i > 2^(i-1) + k / 2
2^(i-1) > k / 2
2^i > k
我们知道2^i一定大于k,所以成立。
所以在查询(最大或最小值)时,我们只需找两个长度为2^log(x)的区间求最大最小值就可以了
此题堪称ST表裸题
【代码】
#include<bits/stdc++.h> using namespace std; int i,j,N,M,k,x,y;
int a[],f_max[][],f_min[][]; int main() { scanf("%d%d",&N,&M);
for (i = ; i <= N; i++) {
scanf("%d",&a[i]);
f_max[i][] = f_min[i][] = a[i];
} for (i = N; i >= ; i--) {
for (j = ; i + (<<j) - <= N; j++) {
f_max[i][j] = max(f_max[i][j-],f_max[i+(<<(j-))][j-]);
f_min[i][j] = min(f_min[i][j-],f_min[i+(<<(j-))][j-]);
}
} for (i = ; i <= M; i++) {
scanf("%d%d",&x,&y);
k = (int)(log(y - x + ) / log(2.0));
printf("%d\n",max(f_max[x][k],f_max[y-(<<k)+][k]) - min(f_min[x][k],f_min[y-(<<k)+][k]));
} return ; }
【USACO】 Balanced Lineup的更多相关文章
- 【USACO】 Balanced Photo
[题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...
- 【poj3264】 Balanced Lineup
http://poj.org/problem?id=3264 (题目链接) 题意 给出序列,求区间最大值-最小值 Solution 无修改,询问较多,ST表水一发. ST算法(Sparse Table ...
- 【POJ3264】Balanced Lineup(RMQ)
题意:每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛 ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- 1642: 【USACO】Payback(还债)
1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...
- 1519: 【USACO】超级书架
1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...
- Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers
[USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...
- 【CPLUSOJ】【USACO】【差分约束】排队(layout)
[题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...
- 【LeetCode】Balanced Binary Tree 解题报告
[题目] Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bi ...
随机推荐
- 洛谷——P2733 家的范围 Home on the Range
P2733 家的范围 Home on the Range 题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形 ...
- 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛
ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...
- 简化LINUX的命令输入 简化linux命令 快捷键 短路径
在LINUX中,有很多常用的命令,常用的命令我们可以熟练的记忆,但是对于不经常使用的命令恐怕是需要翻阅手册了,但是我们可以简化这些命令的输入来达到简便记忆的效果. 这里以BSH为例: 编辑/etc/b ...
- 5.JAVA语言基础部分—多线程
一个应用有一个进程,一个进程里可以用多个线程 1)定义 定义线程有两种方式,一是继承java.lang.Thread类,二是实现java.lang.Runnable接口.其实Thread类就是实现了R ...
- linux驱动开发流程
嵌入式linux驱动开发流程嵌入式系统中,操作系统是通过各种驱动程序来驾驭硬件设备的.设备驱动程序是操作系统内核和硬件设备之间的接口,它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个 ...
- 线性表的顺序存储和链式存储的实现(C)
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...
- git log 查看版本演变历史
1.查看git操作历史 $ git log #git 查看git操作历史 $ git log --oneline #git 简洁的查看git变更记录 $ git log -n4 --onelin ...
- vc常用类总结(转载)
常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, i ...
- javascript 复制粘贴操作
function CopyCode(key){ var trElements = document.all.tags("tr");//获取tr元素 var i; for(i = 0 ...
- Codeforces 3A-Shortest path of the king(BFS打印路径)
A. Shortest path of the king time limit per test 1 second memory limit per test 64 megabytes input s ...