Description

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

这道题目有两个思路:1、对原序列差分,转化为经典问题。2、线段树维护6个东西,分别是左边开始的最长不上升序列、最长不下降序列长度,右边开始的最长不上升序列、最长不下降序列长度,本段内最长不上升序列、最长不下降序列长度。我写了后面的。代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
const int maxn=50050;
int n,a[maxn];
int trlen=0;
struct Tree{int l,r,lc,rc,lup,ldown,rup,rdown,up,down;}tr[maxn*4];
Tree pushup(Tree lc,Tree rc,int L,int R,int l,int r)
{Tree t;t.lc=L;t.rc=R;t.l=l;t.r=r;if(lc.lup==lc.r-lc.l+1&&lc.r<=n&&a[lc.r]<=a[lc.r+1])t.lup=lc.lup+rc.lup;else t.lup=lc.lup;if(lc.ldown==lc.r-lc.l+1&&lc.r<=n&&a[lc.r]>=a[lc.r+1])t.ldown=lc.ldown+rc.ldown;else t.ldown=lc.ldown;if(rc.rup==rc.r-rc.l+1&&rc.l>1&&a[rc.l-1]>=a[rc.l])t.rup=rc.rup+lc.rup;else t.rup=rc.rup;if(rc.rdown==rc.r-rc.l+1&&rc.l>1&&a[rc.l-1]<=a[rc.l])t.rdown=rc.rdown+lc.rdown;else t.rdown=rc.rdown;t.up=max(lc.up,rc.up);if(lc.r<=n&&a[lc.r]<=a[lc.r+1])t.up=max(t.up,lc.rdown+rc.lup);t.down=max(lc.down,rc.down);if(lc.r<=n&&a[lc.r]>=a[lc.r+1])t.down=max(t.down,lc.rup+rc.ldown);return t;
}
void build(int l,int r)
{int t=++trlen;tr[t].l=l;tr[t].r=r;if(l==r)tr[t].lup=tr[t].ldown=tr[t].rup=tr[t].rdown=tr[t].up=tr[t].down=1;if(l<r){int mid=l+r>>1;int lc=trlen+1;build(l,mid);int rc=trlen+1;build(mid+1,r);tr[t]=pushup(tr[lc],tr[rc],lc,rc,l,r);}
}
Tree query(int now,int l,int r)
{if(tr[now].l==l&&tr[now].r==r)return tr[now];int mid=tr[now].l+tr[now].r>>1,lc=tr[now].lc,rc=tr[now].rc;if(r<=mid)return query(lc,l,r);else if(l>mid)return query(rc,l,r);else return pushup(query(lc,l,mid),query(rc,mid+1,r),tr[now].lc,tr[now].rc,tr[now].l,tr[now].r);
}
int main()
{n=read();for(int i=1;i<=n;i++)a[i]=read();build(1,n);int q=read();while(q--){int l=read(),r=read();Tree ans=query(1,l,r);printf("%d\n",max(ans.up,ans.down));}
}

[BZOJ]4491: 我也不知道题目名字是什么 线段树(差分)相关推荐

  1. bzoj 4491: 我也不知道题目名字是什么(线段树区间和并)

    4491: 我知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 347  Solved: 196 [Submit][Status][ ...

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

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

  3. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  4. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】

    bzoj题面什么鬼啊-- 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi-1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即 ...

  5. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  6. P4770-[NOI2018]你的名字【SAM,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为nnn的字符串SSS.qqq次询问给出一个串TTT和一个区间[L,R][L,R][ ...

  7. BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 1469  Solved: 631 [Submit][Status][D ...

  8. [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...

  9. BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)

    题目描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题目大意:求最小不能被一段区间中某些数的和表示的数.(还是看题面吧) 思路 可持久化 ...

最新文章

  1. MyBatis中jdbcType=INTEGER、VARCHAR作用
  2. 20172310 2017-2018-2 《程序设计与数据结构》第十一周学习总结
  3. SRS学习笔记7-SrsHttpServer
  4. Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目01
  5. laravel 框架基础 学习整理
  6. 一篇男人必看的创业文章。(人活着不能没有钱,但是活着却不能只为了钱)...
  7. 产品经理欲哭无泪的瞬间2(太真实了)
  8. (十五) 构建springmvc+mybatis+dubbo分布式平台-window安装dubbo管控台
  9. 在pycharm运行正常,在命令行窗口出现引包错误
  10. iOS开发日记40-详解React Native
  11. CCNA培训课总结笔记--静态路由实现负载均衡(四)
  12. java fastjson 格式化_json的格式化展示(基于 fastjson)
  13. Win11 U盘驱动异常怎么调整为正常?
  14. Linux 命令(184)—— at 命令
  15. 程序员月薪25000,很可能会掉进这个陷进了!
  16. html只能有一对body,一个HTML文档只能含有一对body标记,且body标记必须在html标记内。...
  17. 生鲜配送系统开发功能流程 生鲜配送系统源码
  18. JFreeChart饼图, java程序中加载宋体字库
  19. Windows 硬盘安装 Ubuntu 教程
  20. 深入学习JVM(中)

热门文章

  1. 英飞凌TLE9854QX使用hall元器件对电机运行进行采样计数
  2. javascript怎么隐藏显示div
  3. 各种进制之间的转换方法
  4. matlab的符号变量sym,syms
  5. 疯狂动物城的代码,还需要修改,但有一点雏形
  6. Voyager下的Dashboard Widgets
  7. 【论文阅读】保守和适应性惩罚+基于模型的安全强化学习
  8. 【数学建模】常用微分方程模型 + 详细手写公式推导 + Matlab代码实现
  9. 华为折叠x2是鸿蒙系统吗,华为发布折叠旗舰Mate X2:各种黑科技设计,率先升级鸿蒙系统...
  10. 典当行最多能够抵押多长时间