思路:

(是不是只有我作大死写了个分块)

up[i][j]表示从第i块开始到第j个位置 上升的最大值

down[i][j]同理

left_up[i]表示从第i块开始能够上升的最长长度

left_down[i]同理

right_up[i]表示从第i块结尾上升的最长长度

right_down[i]同理

然后就是各种恶心的分类讨论

(见代码吧,,,,,,)

嗯这道题还可以差分以后线段树维护>0的最长长度(左max 右max 区间max)

  1. //By SiriusRen
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. const int N=,inf=0x3f3f3f3f;
  8. int n,q,l,r,a[N],block[N],up[][N],down[][N],left_up[],left_down[],right_up[],right_down[];
  9. int main(){
  10. scanf("%d",&n);int Block=sqrt(n);
  11. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  12. for(int i=;i<=n;i++)block[i]=(i-)/Block+;
  13. for(int i=;i<=block[n];i++){
  14. int temp_up=,temp_down=,f_up=,f_down=;
  15. for(int j=lower_bound(block+,block++n,i)-block;j<=n;j++){
  16. up[i][j]=max(up[i][j-],temp_up),down[i][j]=max(temp_down,down[i][j-]);
  17. if(!f_down)left_down[i]=temp_down;
  18. if(!f_up)left_up[i]=temp_up;
  19. if(a[j+]>a[j])temp_up++,temp_down=,f_down=;
  20. else if(a[j+]<a[j])temp_down++,temp_up=,f_up=;
  21. else temp_up++,temp_down++;
  22. }
  23. }
  24. for(int i=;i<=block[n];i++){
  25. int temp=lower_bound(block+,block++n,i)-block,j=upper_bound(block+,block++n,i)-block-,temp_up=,temp_down=;
  26. for(;block[j]==block[temp];j--){
  27. right_up[i]=max(right_up[i],temp_up),right_down[i]=max(right_down[i],temp_down);
  28. if(a[j-]>a[j])temp_up++,temp_down=-inf;
  29. else if(a[j-]<a[j])temp_down++,temp_up=-inf;
  30. else temp_up++,temp_down++;
  31. }
  32. }
  33. scanf("%d",&q);
  34. while(q--){
  35. scanf("%d%d",&l,&r);
  36. if(block[l]==block[r]){
  37. int ans=;
  38. int temp_up=,temp_down=;
  39. for(int j=l;j<=r;j++){
  40. ans=max(ans,max(temp_up,temp_down));
  41. if(a[j+]>a[j])temp_up++,temp_down=;
  42. else if(a[j+]<a[j])temp_down++,temp_up=;
  43. else temp_up++,temp_down++;
  44. }
  45. printf("%d\n",ans);
  46. }
  47. else{
  48. int L=block[l]+,ans=max(up[L][r],down[L][r]),temp_up=,temp_down=;
  49. int beginL=lower_bound(block+,block++n,L)-block;
  50. for(int j=l;j<beginL;j++){
  51. ans=max(ans,max(temp_up,temp_down));
  52. if(a[j+]>a[j])temp_up++,temp_down=;
  53. else if(a[j+]<a[j])temp_down++,temp_up=;
  54. else temp_up++,temp_down++;
  55. }
  56. if(a[beginL]>=a[beginL-]){
  57. int tmpx=min(right_down[L-],beginL-l),tmpy=min(r-beginL+,left_up[L]);
  58. ans=max(ans,tmpx+tmpy);
  59. }
  60. if(a[beginL]<=a[beginL-]){
  61. int tmpx=min(right_up[L-],beginL-l),tmpy=min(r-beginL+,left_down[L]);
  62. ans=max(ans,tmpx+tmpy);
  63. }
  64. printf("%d\n",ans);
  65. }
  66. }
  67. }

BZOJ 4491 分块OR差分+线段树的更多相关文章

  1. 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树

    题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...

  2. [Luogu5327][ZJOI2019]语言(树上差分+线段树合并)

    首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路 ...

  3. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

  4. [BZOJ3307] 雨天的尾巴(树上差分+线段树合并)

    [BZOJ3307] 雨天的尾巴(树上差分+线段树合并) 题面 给出一棵N个点的树,M次操作在链上加上某一种类别的物品,完成所有操作后,要求询问每个点上最多物品的类型. N, M≤100000 分析 ...

  5. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  6. LUOGU P1438 无聊的数列 (差分+线段树)

    传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...

  7. BZOJ 3307 雨天的尾巴 (树上差分+线段树合并)

    题目大意:给你一棵树,树上一共n个节点,共m次操作,每次操作给一条链上的所有节点分配一个权值,求所有节点被分配到所有的权值里,出现次数最多的权值是多少,如果出现次数相同就输出最小的. (我辣鸡bzoj ...

  8. bzoj 3307: 雨天的尾巴【树剖lca+树上差分+线段树合并】

    这居然是我第一次写线段树合并--所以我居然在合并的时候加点结果WAWAWAMLEMLEMLE--!ro的时候居然直接指到la就行-- 树上差分,每个点建一棵动态开点线段树,然后统计答案的时候合并即可 ...

  9. BZOJ 3626: [LNOI2014]LCA(树剖+差分+线段树)

    传送门 解题思路 比较有意思的一道题.首先要把求\(\sum\limits_{i=l}^r dep[lca(i,z)]\)这个公式变一下.就是考虑每一个点的贡献,做出贡献的点一定在\(z\)到根节点的 ...

随机推荐

  1. Qt无法用UTF-8编辑问题

    原因: Windows默认编码格式是GBK. 而QT-各默认版本的编码格式是UTF-8. 解决方法": Windows环境下,Qt Creator,菜单->工具->选项-> ...

  2. 实验8 标准模板库STL

    一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...

  3. 使用 C# 进行 HTTP 操作

    说明 主要使用到了 Newtonsoft.Json 和 System.Net 两个命名空间. Program.cs static void Main(string[] args) { WebOpert ...

  4. mvc重定向

    出处 : https://www.cnblogs.com/lgxlsm/p/5441149.html .重定向方法:Redirect / RedirectToAction / RedirectToRo ...

  5. jq 替换DOM layeui 不刷新

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Docker 数据卷重复挂载测试

    没想到一年没写博客了,这中间都是记在自己的笔记本上,大部分网上都有,这个好像没有,所以发上来吧! 本文是测试Docker容器(相同目录/父子目录)同时挂载到宿主机(同目录/不同目录)时的情况,废话少说 ...

  7. Mysql 之实现多字段模糊查询

    在一个table中有省,市,县,期,栋,单元,室几个字段,然后用户输入一个地址从表中的字段拼接起来进行模糊查询. 解决办法: <MySQL权威指南>中CONCAT的使用方法,在书中的对CO ...

  8. 初识 Django

    HTTP协议 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...

  9. jquery获取当前时间并且格式化

    Date.prototype.Format = function (fmt) {      var o = {          "M+": this.getMonth() + 1 ...

  10. eas之视图冻结与解冻

    // 冻结视图 table.getViewManager().freeze(verticalIndex, horizonIndex); //冻结视图:该方法在table还没显示的时候使用,也就是该方法 ...