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

9
1 2 3 4 5 6 5 4 3
5
1 6
1 7
2 7
1 9
5 9

Sample Output

6
6
5
6
4
//样例解释
五个询问分别对应
[1,6][1,6][2,6][1,6][6,9]

HINT

N,Q<=50000

Source

By 一个读错题的沙茶

想法:每个点存下$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的更多相关文章

  1. BZOJ 4491: 我也不知道题目名字是什么

    4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 278  Solved: 154[Submit][Status][ ...

  2. BZOJ 4491: 我也不知道题目名字是什么 线段树+离线

    code: #include <string> #include <cstring> #include <cstdio> #include <algorith ...

  3. 【BZOJ4991】我也不知道题目名字是什么(线段树)

    [BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...

  4. 【BZOJ4491】我也不知道题目名字是什么 [线段树]

    我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...

  5. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

  6. BZOJ4491: 我也不知道题目名字是什么

    Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一 ...

  7. 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)

    传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...

  8. Floyd | | jzoj[1218] | | [Usaco2009 Dec]Toll 过路费 | | BZOJ 1774 | | 我也不知道该怎么写

    写在前面:老师说这一道题是神题,事实上确实如此,主要是考察对Floyd的理解 ******************************题目.txt************************* ...

  9. BZOJ 1622: [Usaco2008 Open]Word Power 名字的能量

    题目 1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 349  Solved ...

随机推荐

  1. 读取web应用下的资源文件(例如properties)

    package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...

  2. linux下gsoap的初次使用 -- c风格加法实例

    摘自: http://blog.csdn.net/jinpw/article/details/3346844 https://www.cnblogs.com/dkblog/archive/2011/0 ...

  3. 文件解析库doctotext源码分析

    doctotext中没有make install选项,make后生成可执行文件 在buile目录下面有.so动态库和头文件,需要的可以从这里面拷贝 build/doctotext就是可执行程序.   ...

  4. Umbraco examine search media folder 中的pdf文件

    可以参考的文章 http://sleslie.me/2015/selecting-media-using-razor-slow-performance-examine-to-the-rescue/ h ...

  5. MVC实用笔记

    ---------------------------- 渲染一个Action:@{Html.RenderAction("Rulelist", "AjaxReuqestD ...

  6. POJ2549【hash分离链接法】

    题意: 给n个不同的数,求一个4个数(a,b,c,d)的组合满足a+b+c=d;求最大的d. 思路: 没想到可以用hash搞/ 这个就是数据结构里的分离链接法~ 解决hash冲突的方法:将所有关键字为 ...

  7. python矩阵相加

    举个栗子: # 两个 3 行 3 列的矩阵,实现其对应位置的数据相加,并返回一个新矩阵: # 使用 for 迭代并取出 X 和 Y 矩阵中对应位置的值,相加后放到新矩阵的对应位置中. import n ...

  8. [Xcode 实际操作]六、媒体与动画-(15)使用AudioPlayer播放音乐

    目录:[Swift]Xcode实际操作 本文将演示如何播放音频素材. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文 ...

  9. Node.js crypto加密模块汇总

    第一篇文章:MD5 和 SHA家族 概述:使用Node实现较为简单的Hash加密算法,本篇实际上重不在Hash加密,主要的还是为了引出crypto加密的三种方式 第二篇文章:HMAC 概述:密钥相关的 ...

  10. 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编 ...