思路:

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

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. 如何实现MySQL数据库使用情况的审计

    如何实现MySQL数据库使用情况的审计   最佳答案   mysql的审计功能 mysql服务器自身没有提供审计功能,但是我们可以使用init-connect + binlog的方法进行mysql的操 ...

  2. 【sqli-labs】 less8 GET - Blind - Boolian Based - Single Quotes (基于布尔的单引号GET盲注)

    加单引号 没有任何信息输出 加and 页面变化,不正常是没有任何回显 http://localhost/sqli/Less-8/?id=1' and '1'='1 http://localhost/s ...

  3. 微信小程序 请求超时处理

    1.在app.json加入一句 "networkTimeout": { "request": 10000 } 设置超时时间,单位毫秒 2.请求 wx.reque ...

  4. APICloud 获取缓存以及清除缓存(常用第三方方法)

    一.app中经常会有缓存的清除这个操作,具体如下 1.获取缓存大小 apiready = function() { api.getCacheSize(function(ret, err) { //si ...

  5. 解决postman https请求无返回数据的问题

    1.点击右上角的扳手图标 2.点击settings 3.点击general 4.把 ssl certificate verification这项点击关闭

  6. Android 性能测试初探(二)

    书接前文 Android 性能测试初探(一).上回大体介绍了下在 android 端的性能测试项,现在我们就细节测试项做一些阐述(包括如何自己 DIY 测试). 首先我们来说说启动时间.关于应用的启动 ...

  7. PAT_A1140#Look-and-say Sequence

    Source: PAT A1140 Look-and-say Sequence (20 分) Description: Look-and-say sequence is a sequence of i ...

  8. Linux 僵尸进程如何处理

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  9. Package和Activity

    Package Package 包.只是在我们的app中这个Package是唯一的,就像你身份证号码一样.在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道 ...

  10. GDB调试工具、动态加载、内存管理(day04)

    一.程序中的错误处理 在系统中定义了一个全局变量errno.在这个全局变量中存放着系统调用或者库函数出错的信息(错误编号).然后根据错误编号获取错误信息. 举例说明: 打开一个文件,如果这个文件不存在 ...