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. 《SpringBoot揭秘 快速构建微服务体系》读后感(四)

    再谈自动配置 基于条件的自动配置 调整自动配置的顺序

  2. 【机器学习】分类算法——Logistic回归

    一.LR分类器(Logistic Regression Classifier) 在分类情形下,经过学习后的LR分类器是一组权值w0,w1, -, wn,当测试样本的数据输入时,这组权值与测试数据按照线 ...

  3. android fragment ontouch 事件

    由于fragment是存在于activity之中的,所以触摸事件会被activity首先得到. 为了在fragment中执行ontouch方法,需要做如下处理: mFragment = new Tab ...

  4. IIS 中的虚拟目录 和软连接

    在WIndows 中 可以这样设置 mklink /D  C:\bb C:\cc 这样 bb 就指向 CC了 bb 在IIS中的目录其实就是虚拟目录 .这样大的文件就不用存放在IIS中了,可以放在其他 ...

  5. echarts学习的一些笔记

    工具栏组件 Show 是否显示 Feature 具体显示的功能 saveAslmage  保存图片 Restore 还原 dataZoom  缩放视图 magicType 动态类型切换 toltip组 ...

  6. react中事件的使用

    import React from 'react' class Home extends React.Component{ constructor(props){ super(props) this. ...

  7. 【异步编程】Part2:掌控SynchronizationContext避免deadlock

    引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...

  8. QxOrm 1.2.9 下载 以及编译方法 简介.

    QxOrm 是一个基于QT开发的数据库方面的ORM库,功能很强大,是QT C++数据开发方面的好工具. 目前已经更新1.3.1 .但 不幸的是 它的官网http://www.qxorm.com/ 莫名 ...

  9. css样式也技巧

    目录 关于iPhone的点击事件绑定无效的处理方法 https://blog.csdn.net/u014477038/article/details/52527194 去掉a.button.input ...

  10. Linux运用一些常用命令

    今天搜集整理了一些Linux服务器运维常用命令,希望对大家有帮助:1.删除0字节文件 find -type f -size 0 -exec rm -rf {} 2.查看进程按内存从大到小排列 ps - ...