这道题可以用ST表过:

题目链接

记录4个数组:maxval[][], minval[][], ans[][], rans[][]

maxval[i][j]表示从i号元素开始,长度为(1<<j)(也就是2^j)的区间上的最大值

minval[i][j]表示从i号元素开始,长度为(1<<j)的区间上的最小值

ans[i][j]表示从i号元素开始,长度为(1<<j)的区间从左往右方向的答案

rans[i][j]表示从i号元素开始,长度为(1<<j)的区间从右往左方向的答案

那么易得如下转移方程:

maxval[i][j] = max(maxval[i][j - 1], maxval[i + (1 << (j - 1))][j - 1])

minval差不多

对于ans和rans的转移,我们这样考虑

区间[l, r]上的答案,要么是区间[l, (l+r)/2]上的答案,要么是区间[(l+r)/2+1, r]上的答案,要么是[(l+r)/2+1, r]上的最大值减去[l, (l+r)/2]上的最小值,以上三者中取最大者

ans[i][j] = max(ans[i][j - 1], ans[i + (1 << (j - 1))][j - 1], maxval[i + (1 << (j - 1))][j - 1] - minval[i][j - 1]);

rans差不多

在预处理的时候,要把j的循环提到外层,因为[l, r]的状态需要用到[(l+r)/2+1, r]的状态转移而来

如果j的循环在内层的话,求解[l, r]的状态时[(l+r)/2+1, r]的状态还没有求解过

查询的过程应该比较好理解,直接看代码吧

#include <algorithm>
#include <cmath>
#include <iostream> using std::cin;
using std::cout;
using std::endl;
using std::max;
using std::min; template <typename T>
inline const T &max(const T &a, const T &b, const T &c)
{
return max(a, max(b, c));
} const double LOG2 = std::log(2);
int a[200010];
int maxval[200010][50];
int minval[200010][50];
int ans[200010][50];
int rans[200010][50];
int n, m; inline void stInit()
{
for (int i = 1; i <= n; ++i)
minval[i][0] = maxval[i][0] = a[i];
for (int j = 1; 1 << j <= n; ++j)
for (int i = 1; i + (1 << j) - 1 <= n; ++i)
{
minval[i][j] = min(minval[i][j - 1], minval[i + (1 << (j - 1))][j - 1]);
maxval[i][j] = max(maxval[i][j - 1], maxval[i + (1 << (j - 1))][j - 1]);
ans[i][j] = max(ans[i][j - 1], ans[i + (1 << (j - 1))][j - 1],
maxval[i + (1 << (j - 1))][j - 1] - minval[i][j - 1]);
rans[i][j] = max(rans[i][j - 1], rans[i + (1 << (j - 1))][j - 1],
maxval[i][j - 1] - minval[i + (1 << (j - 1))][j - 1]);
}
}
inline int queryMax(int l, int r)
{
int k = static_cast<int>(std::log(r - l + 1) / LOG2);
return max(maxval[l][k], maxval[r - (1 << k) + 1][k]);
}
inline int queryMin(int l, int r)
{
int k = static_cast<int>(std::log(r - l + 1) / LOG2);
return min(minval[l][k], minval[r - (1 << k) + 1][k]);
}
inline int queryAns(int l, int r)
{
int k = static_cast<int>(std::log(r - l + 1) / LOG2);
if (l + (1 << k) > r)
return max(ans[l][k], ans[r - (1 << k) + 1][k]);
else
return max(ans[l][k], ans[r - (1 << k) + 1][k],
queryMax(l + (1 << k), r) - queryMin(l, r - (1 << k)));
}
inline int queryRans(int l, int r)
{
int k = static_cast<int>(std::log(r - l + 1) / LOG2);
if (l + (1 << k) > r)
return max(rans[l][k], rans[r - (1 << k) + 1][k]);
else
return max(rans[l][k], rans[r - (1 << k) + 1][k],
queryMax(l, r - (1 << k)) - queryMin(l + (1 << k), r));
} int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i];
stInit();
cin >> m;
while (m--)
{
int l, r;
cin >> l >> r;
if (l < r)
cout << queryAns(l, r) << endl;
else if (l > r)
cout << queryRans(r, l) << endl;
else
cout << 0 << endl;
}
return 0;
}

不难看出,查询的时间复杂度是O(1)的,预处理的时间复杂度是O(nlogn)的

codevs 3304 水果姐逛水果街Ⅰ的更多相关文章

  1. 水果姐逛水果街Ⅱ codevs 3305

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB   题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...

  2. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  3. Codevs 3304 水果姐逛水果街Ⅰ 线段树

    题目: http://codevs.cn/problem/3304/   时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 D ...

  4. CodeVs——T 3304 水果姐逛水果街Ⅰ

    http://codevs.cn/problem/3304/ 时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Des ...

  5. 水果姐逛水果街Ⅰ(codevs 3304)

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  6. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA

    题目:http://codevs.cn/problem/3305/  时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Des ...

  7. CodeVs——T 3305 水果姐逛水果街Ⅱ

    http://codevs.cn/problem/3305/  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 De ...

  8. codevs 3305 水果姐逛水果街Ⅱ&&codevs3006

    题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...

  9. codevs3305 水果姐逛水果街Ⅱ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  10. codevs3304 水果姐逛水果街

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

随机推荐

  1. Codeforces Round #599 (Div. 2) A. Maximum Square 水题

    A. Maximum Square Ujan decided to make a new wooden roof for the house. He has

  2. java图形界面 计算器实现

    编写程序实现一个简单计算器的基本功能,具体可以模仿Windows附件中的计算器或模拟常见的实物计算器. package beizi; import java.awt.EventQueue; impor ...

  3. Windows许可证 即将过期

    最近打开电脑,系统总是自动弹出Windows许可证即将过期的弹窗,现在总结方法如下. 命令都是在运行窗口输入的打开方式:win+R组合键或者右键点击win10开始菜单,点击“运行”查看系统版本:win ...

  4. ASP.NET Core 中使用负载均衡时获取客户端 IP

    在使用负载均衡的情况下,通过 context.Connection.RemoteIpAddress 获取到的是负载均衡的 IP 地址,需要通过 X-Forwarded-For 请求头才能获取到客户端的 ...

  5. 为何我建议1-3年的Java程序员仔细看看这篇文章

    此文的目的是为了督促自己去不断学习,让自己有更明确的方向去提升自己.以技能树为基础,以面试要点为大纲,我觉得比抓住什么看什么要更有目的,更能坚持下去.世界瞬息万变,我们要时刻准备着.时刻提高着自己,才 ...

  6. jieba 分词使用入门

    1. 介绍 JIEBA 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性: 支持 3 种分词模式:精确模式.全模式.搜索引擎模式 支持繁体分词 支持自定义词典 import jieb ...

  7. oidc hybrid flow 与另外两种模式的异同

    很多学习identityserver的文章都没有解释清楚oidc hybrid混合模式的含义.本文将解释hybrid模式与另外两种模式的主要区别. 我们先看一下一手文档: https://openid ...

  8. sequelize时间自动格式化

    问题 每次查询datetime的字段,显示出来都是这种格式 2019-08-27T12:02:05.000Z 解决办法 初始化Sequelize的时候传入dialectOptions参数 let se ...

  9. 一段不错的iframe自适应的代码直接拿来用了

    一段不错的iframe自适应的代码直接拿来用了 <?php echo " <!DOCTYPE html> <html lang='en'> <head&g ...

  10. 初学Python常见异常错误,总有一处你会遇到!

    初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了pytho ...