传送门

题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串。


思路:

注意要求的是子串而不是子序列!!!

然后直接用线段树维护最大子段和的方式合并一下就完了。

注意要维护当前区间最靠左/右的数是什么。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
const int N=50005;
int n,a[N];
inline int max(const int&a,const int&b){return a>b?a:b;}
inline int max(const int&a,const int&b,const int&c){return a>b?(a>c?a:c):(b>c?b:c);}
namespace SGT{
    #define lc (p<<1)
    #define rc (p<<1|1)
    #define mid (l+r>>1)
    struct Val{
        int L,R,len,ls[2],rs[2],ms[2];
        friend inline Val operator+(const Val&a,const Val&b){
            Val ret;
            ret.L=a.L,ret.R=b.R,ret.len=a.len+b.len;
            ret.rs[0]=b.rs[0]+(b.rs[0]==b.len&&a.R<=b.L?a.rs[0]:0);
            ret.rs[1]=b.rs[1]+(b.rs[1]==b.len&&a.R>=b.L?a.rs[1]:0);
            ret.ls[0]=a.ls[0]+(a.ls[0]==a.len&&a.R<=b.L?b.ls[0]:0);
            ret.ls[1]=a.ls[1]+(a.ls[1]==a.len&&a.R>=b.L?b.ls[1]:0);
            ret.ms[0]=max(a.ms[0],b.ms[0],a.R<=b.L?a.rs[0]+b.ls[0]:0);
            ret.ms[1]=max(a.ms[1],b.ms[1],a.R>=b.L?a.rs[1]+b.ls[1]:0);
            return ret;
        }
        inline void Set(const int&x){L=R=x,len=ls[0]=rs[0]=ms[0]=ls[1]=rs[1]=ms[1]=1;}
    };
    struct Node{int l,r;Val val;}T[N<<2];
    inline void pushup(int p){T[p].val=T[lc].val+T[rc].val;}
    inline void build(int p,int l,int r){
        T[p].l=l,T[p].r=r;
        if(l==r)return T[p].val.Set(a[l]);
        build(lc,l,mid),build(rc,mid+1,r),pushup(p);
    }
    inline Val query(int p,int l,int r,int ql,int qr){
        if(ql<=l&&r<=qr)return T[p].val;
        if(qr<=mid)return query(lc,l,mid,ql,qr);
        if(ql>mid)return query(rc,mid+1,r,ql,qr);
        return query(lc,l,mid,ql,mid)+query(rc,mid+1,r,mid+1,qr);
    }
    #undef lc
    #undef rc
    #undef mid
}
int main(){
    n=read();
    for(ri i=1;i<=n;++i)a[i]=read();
    SGT::build(1,1,n);
    SGT::Val tmp;
    for(ri tt=read(),l,r;tt;--tt){
        l=read(),r=read(),tmp=SGT::query(1,1,n,l,r);
        cout<<max(tmp.ms[0],tmp.ms[1])<<'\n';
    }
    return 0;
}

2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  9. Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)

    题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...

随机推荐

  1. PHP使用RabbitMQ实例

    相关博文:CentOS6.9安装RabbitMQ和源码编译安装php的RabbitMQ扩展RabbitMQ入门基础CentOS7源码编译安装nginx+php7.2+mysql5.7并使用system ...

  2. Java中获取系统时间的四种方式

    第一种: Date day=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...

  3. ArcGIS 图层旋转工具-arcgis案例实习教程

    ArcGIS 图层旋转工具-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对输入图层执行坐标旋转 使用方法:输入图层,旋转中心,旋转 ...

  4. java使用c3p0连接mysql,写中文数据乱码的问题

    此文说的乱码,是指所有中文的字符都变成了?. 首先,网上普遍搜索到的解决方案都是告诉你要在数据库连接字符串里面增加编码的定义,完整的连接字符串如下: url="jdbc:mysql://12 ...

  5. vue--组件基础

    组件是可复用的 vue 实例,它与new Vue 接收相同的参数,例如:data.methods.computed.watch 以及生命周期钩子.除了 el 等. 1.组件注册必须有一个组件名. 组件 ...

  6. javaMail实现收发邮件(四)

    JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操作,在介绍这些类之前,我们先来了解下邮件接收API的体系结构,JavaMai API中定义了一个java.mail.Store类 ...

  7. Java框架spring 学习笔记(十六):c3p0连接池的配置以及dao使用jdbcTemplate

    连接池可以大大提高数据库的性能和连接速度,将那些已连接的数据库连接存放在一个连接池里,以后别人要连接数据库的时候,将不会重新建立数据库连接,直接从连接池中取出可用的连接,用户使用完毕后,会释放连接重新 ...

  8. 985. Sum of Even Numbers After Queries

    We have an array A of integers, and an array queries of queries. For the i-th query val = queries[i] ...

  9. IIS 设置查询字符串长度

  10. 第八周博客作业 <西北师范大学| 周安伟>

    第八周博客作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求博客链接https://www.cnblogs.com/nwnu-daizh/p/10687 ...