BZOJ 4491: 我也不知道题目名字是什么 RMQ
4491: 我也不知道题目名字是什么
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 317 Solved: 174
[Submit][Status][Discuss]
Description
给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串
Input
第一行n,表示A数组有多少元素
接下来一行为n个整数A[i]
接下来一个整数Q,表示询问数量
接下来Q行,每行2个整数l,r
Output
对于每个询问,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串
Sample Input
1 2 3 4 5 6 5 4 3
5
1 6
1 7
2 7
1 9
5 9
Sample Output
6
5
6
4
//样例解释
五个询问分别对应
[1,6][1,6][2,6][1,6][6,9]
HINT
N,Q<=50000
Source
想法:每个点存下$L_i$往左边最长合法,$R_i$往右边最长合法。$[l,r]$的答案即为$max\{R[l],R[l+1]...R[r-L[r]],min(L[r],r-l+1)\}$
用RMQ解决区间最值。
如果这道题有修改怎么做?需要支持区间赋值,求区间最值的线段树。
#include<cstdio> typedef long long ll;
template<class T>
inline void read(T&x)
{
x=;bool f=;char c=getchar();
while((c<''||c>'')&&c!='-') c=getchar();if(c=='-')f=, c=getchar();
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
x=f?-x:x;
}
const int MAXN();
int n,l,r,Ans,a[MAXN],T[MAXN],R[MAXN],L[MAXN],Q;
int max(int a,int b){return a>b?a:b;}
int F[][MAXN],logg[MAXN];
void DealRMQ()
{
for(int i=;i<=n;i++)logg[i]=logg[i>>]+;
for(int i=;i<=n;i++)F[][i]=R[i];
for(int j=;j<=logg[n];j++)
for(int i=;i<=n;i++)
{
int w=<<(j-); if(i+w>n)break;
F[j][i]=max(F[j-][i],F[j-][i+w]);
}
}
int Ask(int l,int r)
{
int k=logg[r-l+]; int w=<<k;
// fprintf(stderr,"%d %d\n",F[k][l],F[k][r-w+1]);
return max(F[k][l],F[k][r-w+]);
}
int main()
{
// freopen("C.in","r",stdin);
read(n);
for(int i=;i<=n;i++)read(a[i]);
for(int i=n;i>=;i--) T[i]=+(a[i+]>=a[i])*T[i+],R[i]=max(R[i],T[i]);
for(int i=n;i>=;i--) T[i]=+(a[i+]<=a[i])*T[i+],R[i]=max(R[i],T[i]);
for(int i=;i<=n;i++) T[i]=+(a[i-]<=a[i])*T[i-],L[i]=max(L[i],T[i]);
for(int i=;i<=n;i++) T[i]=+(a[i-]>=a[i])*T[i-],L[i]=max(L[i],T[i]);
// for(int i=1;i<=n;i++)
// printf("i:%d\n L:%d\n R:%d\n",i,L[i],R[i]);
DealRMQ();
read(Q);
for(int i=;i<=Q;i++)
{
read(l);read(r);
if(r-L[r]+<=l)Ans=r-l+;
else
{
Ans=L[r]; r=r-L[r];
// fprintf(stderr,"l:%d r%d\n",l,r);
Ans=max(Ans,Ask(l,r));
}
printf("%d\n",Ans);
}
return ;
}
BZOJ 4491: 我也不知道题目名字是什么 RMQ的更多相关文章
- BZOJ 4491: 我也不知道题目名字是什么
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 278 Solved: 154[Submit][Status][ ...
- BZOJ 4491: 我也不知道题目名字是什么 线段树+离线
code: #include <string> #include <cstring> #include <cstdio> #include <algorith ...
- 【BZOJ4991】我也不知道题目名字是什么(线段树)
[BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...
- 【BZOJ4491】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- BZOJ4491: 我也不知道题目名字是什么
Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一 ...
- 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...
- Floyd | | jzoj[1218] | | [Usaco2009 Dec]Toll 过路费 | | BZOJ 1774 | | 我也不知道该怎么写
写在前面:老师说这一道题是神题,事实上确实如此,主要是考察对Floyd的理解 ******************************题目.txt************************* ...
- BZOJ 1622: [Usaco2008 Open]Word Power 名字的能量
题目 1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 349 Solved ...
随机推荐
- FZU 2057 家谱(dfs)
Problem 2057 家谱 Accept: 129 Submit: 356Time Limit: 1000 mSec Memory Limit : 32768 KB Problem ...
- js中push(),pop(),unshift(),shift()的用法
js中push(),pop(),unshift(),shift()的用法小结 1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及 ...
- 动画重定向技术分析和Unity中的应用
http://www.jianshu.com/p/6e9ba1b9c99e 因为一些手游项目需要使用Unity引擎,但在动画部分需要使用重定向技术来实现动画复用,考虑到有些项目开发人员没有过这方面的经 ...
- Postgresql 10 自带扩展模块功能说明
adminpackadminpack提供了许多支持功能,pgAdmin 和其他管理和管理工具可以使用它们来提供其他功能,例如远程管理服务器日志文件.所有这些功能的使用仅限于超级用户. citext 该 ...
- Java:创建线程
Java定义了两种创建线程的方法: 1.实现Runnable接口 要实现Runnable接口,只需简单地实现run()方法即可,声明如下:public void run() 在run()方法中,可以定 ...
- Mac下磁盘无法抹除问题解决
安装CentOS到扩容卡,每次安装都会造成bootcamp分区的windows出问题,遂安装ubantu,结果扩容卡有问题-->无法读取您的磁盘,打开磁盘工具无法抹除,由于无法读取在window ...
- 解决 程序报 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 错误
调试程序出现如下错误: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Default ...
- Vuex+axios
Vuex+axios Vuex简介 vuex是一个专门为Vue.js设计的集中式状态管理架构. 状态? 我们把它理解为在data中需要共享给其他组件使用的部分. Vuex和单纯的全局对象有以下不同 ...
- Net Core 分布式微服务框架
Jimu : .Net Core 分布式微服务框架介绍 https://www.cnblogs.com/grissom007/p/9291345.html 一.前言 近些年一直浸淫在 .Net 平台做 ...
- opencv作业
作业下载地址: 链接:http://pan.baidu.com/s/1qYQnbkw 密码:v7y9