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 ...
随机推荐
- 读取web应用下的资源文件(例如properties)
package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...
- linux下gsoap的初次使用 -- c风格加法实例
摘自: http://blog.csdn.net/jinpw/article/details/3346844 https://www.cnblogs.com/dkblog/archive/2011/0 ...
- 文件解析库doctotext源码分析
doctotext中没有make install选项,make后生成可执行文件 在buile目录下面有.so动态库和头文件,需要的可以从这里面拷贝 build/doctotext就是可执行程序. ...
- Umbraco examine search media folder 中的pdf文件
可以参考的文章 http://sleslie.me/2015/selecting-media-using-razor-slow-performance-examine-to-the-rescue/ h ...
- MVC实用笔记
---------------------------- 渲染一个Action:@{Html.RenderAction("Rulelist", "AjaxReuqestD ...
- POJ2549【hash分离链接法】
题意: 给n个不同的数,求一个4个数(a,b,c,d)的组合满足a+b+c=d;求最大的d. 思路: 没想到可以用hash搞/ 这个就是数据结构里的分离链接法~ 解决hash冲突的方法:将所有关键字为 ...
- python矩阵相加
举个栗子: # 两个 3 行 3 列的矩阵,实现其对应位置的数据相加,并返回一个新矩阵: # 使用 for 迭代并取出 X 和 Y 矩阵中对应位置的值,相加后放到新矩阵的对应位置中. import n ...
- [Xcode 实际操作]六、媒体与动画-(15)使用AudioPlayer播放音乐
目录:[Swift]Xcode实际操作 本文将演示如何播放音频素材. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文 ...
- Node.js crypto加密模块汇总
第一篇文章:MD5 和 SHA家族 概述:使用Node实现较为简单的Hash加密算法,本篇实际上重不在Hash加密,主要的还是为了引出crypto加密的三种方式 第二篇文章:HMAC 概述:密钥相关的 ...
- 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)
题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编 ...