思路:

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

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)

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=,inf=0x3f3f3f3f;
int n,q,l,r,a[N],block[N],up[][N],down[][N],left_up[],left_down[],right_up[],right_down[];
int main(){
scanf("%d",&n);int Block=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)block[i]=(i-)/Block+;
for(int i=;i<=block[n];i++){
int temp_up=,temp_down=,f_up=,f_down=;
for(int j=lower_bound(block+,block++n,i)-block;j<=n;j++){
up[i][j]=max(up[i][j-],temp_up),down[i][j]=max(temp_down,down[i][j-]);
if(!f_down)left_down[i]=temp_down;
if(!f_up)left_up[i]=temp_up;
if(a[j+]>a[j])temp_up++,temp_down=,f_down=;
else if(a[j+]<a[j])temp_down++,temp_up=,f_up=;
else temp_up++,temp_down++;
}
}
for(int i=;i<=block[n];i++){
int temp=lower_bound(block+,block++n,i)-block,j=upper_bound(block+,block++n,i)-block-,temp_up=,temp_down=;
for(;block[j]==block[temp];j--){
right_up[i]=max(right_up[i],temp_up),right_down[i]=max(right_down[i],temp_down);
if(a[j-]>a[j])temp_up++,temp_down=-inf;
else if(a[j-]<a[j])temp_down++,temp_up=-inf;
else temp_up++,temp_down++;
}
}
scanf("%d",&q);
while(q--){
scanf("%d%d",&l,&r);
if(block[l]==block[r]){
int ans=;
int temp_up=,temp_down=;
for(int j=l;j<=r;j++){
ans=max(ans,max(temp_up,temp_down));
if(a[j+]>a[j])temp_up++,temp_down=;
else if(a[j+]<a[j])temp_down++,temp_up=;
else temp_up++,temp_down++;
}
printf("%d\n",ans);
}
else{
int L=block[l]+,ans=max(up[L][r],down[L][r]),temp_up=,temp_down=;
int beginL=lower_bound(block+,block++n,L)-block;
for(int j=l;j<beginL;j++){
ans=max(ans,max(temp_up,temp_down));
if(a[j+]>a[j])temp_up++,temp_down=;
else if(a[j+]<a[j])temp_down++,temp_up=;
else temp_up++,temp_down++;
}
if(a[beginL]>=a[beginL-]){
int tmpx=min(right_down[L-],beginL-l),tmpy=min(r-beginL+,left_up[L]);
ans=max(ans,tmpx+tmpy);
}
if(a[beginL]<=a[beginL-]){
int tmpx=min(right_up[L-],beginL-l),tmpy=min(r-beginL+,left_down[L]);
ans=max(ans,tmpx+tmpy);
}
printf("%d\n",ans);
}
}
}

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. vim之快速跳转

    光棍节啦, 淘东西的闲暇上来发vim旅途第一篇日志. 为什么呢? 因为今天是我媳妇的生日, 我用这种只有我知道的方式来纪念一下. ^_^, 宝宝生日快乐! 开篇先说明日志布局, vim学习记录连载中所 ...

  2. OpenCV : 基于切线方向的边缘增强算法

    使用切线方法,对切线方向上的边缘进行强化: 参考连接:图像锐化和边缘检测 代码: //在种子点方向上寻找合适的梯度,用于寻找边缘 //对low_Gray, high_gray之间的点寻找边缘 void ...

  3. css3基础篇一

    CSS3 选择器 选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id=&quo ...

  4. Join 语句

    select * from books as A join (select * from Orders) as B on A.BookId = B.BookId select A.BookId,Aut ...

  5. ASP.NE 上传文件控件

    protected void Button1_Click(object sender, EventArgs e) { //if (Request["id"]==null & ...

  6. java StringUtils

    /** * */ package com.sign.utils; import java.util.regex.Pattern; /** * @author Administrator * creat ...

  7. 利用Putty/Plink通过ssh tunnel端口转发实现FireFox和Chrome的加密代理访问

    如果需要使用远端服务器的DNS:在Firefox中about:config设置 network.proxy.socks_remote_dns ==> true 参考原文:http://think ...

  8. 09 Django组件之用户认证组件

    没有学习Django认证组件之前使用装饰器方法 from django.shortcuts import render, HttpResponse, redirect from app01.MyFor ...

  9. PAT_A1138#Postorder Traversal

    Source: PAT A1138 Postorder Traversal (25 分) Description: Suppose that all the keys in a binary tree ...

  10. NOIP2013 DAY2 T3火车运输

    传送门 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况 ...