BZOJ 4491 分块OR差分+线段树
思路:
(是不是只有我作大死写了个分块)
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差分+线段树的更多相关文章
- 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...
- [Luogu5327][ZJOI2019]语言(树上差分+线段树合并)
首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路 ...
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- [BZOJ3307] 雨天的尾巴(树上差分+线段树合并)
[BZOJ3307] 雨天的尾巴(树上差分+线段树合并) 题面 给出一棵N个点的树,M次操作在链上加上某一种类别的物品,完成所有操作后,要求询问每个点上最多物品的类型. N, M≤100000 分析 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- LUOGU P1438 无聊的数列 (差分+线段树)
传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...
- BZOJ 3307 雨天的尾巴 (树上差分+线段树合并)
题目大意:给你一棵树,树上一共n个节点,共m次操作,每次操作给一条链上的所有节点分配一个权值,求所有节点被分配到所有的权值里,出现次数最多的权值是多少,如果出现次数相同就输出最小的. (我辣鸡bzoj ...
- bzoj 3307: 雨天的尾巴【树剖lca+树上差分+线段树合并】
这居然是我第一次写线段树合并--所以我居然在合并的时候加点结果WAWAWAMLEMLEMLE--!ro的时候居然直接指到la就行-- 树上差分,每个点建一棵动态开点线段树,然后统计答案的时候合并即可 ...
- BZOJ 3626: [LNOI2014]LCA(树剖+差分+线段树)
传送门 解题思路 比较有意思的一道题.首先要把求\(\sum\limits_{i=l}^r dep[lca(i,z)]\)这个公式变一下.就是考虑每一个点的贡献,做出贡献的点一定在\(z\)到根节点的 ...
随机推荐
- AI: DL方法与问题空间探索
所谓问题的解决是生存参数空间的一种状态转移到另外一种状态,而目的状态恰好是主体所希望的.完成这种转换的一系列脚本变化过程叫做场景序列,也叫通路.驱动这一些列场景转换的主体参与过程,被称为主动执行.而主 ...
- 【sqli-labs】 less8 GET - Blind - Boolian Based - Single Quotes (基于布尔的单引号GET盲注)
加单引号 没有任何信息输出 加and 页面变化,不正常是没有任何回显 http://localhost/sqli/Less-8/?id=1' and '1'='1 http://localhost/s ...
- 微信小程序 请求超时处理
1.在app.json加入一句 "networkTimeout": { "request": 10000 } 设置超时时间,单位毫秒 2.请求 wx.reque ...
- BZOJ 4195: [Noi2015]程序自动分析 并查集 + 离散化 + 水题
TM 读错题了...... 我还以为是要动态询问呢,结果是统一处理完了再询问...... 幼儿园题,不解释. Code: #include<bits/stdc++.h> #define m ...
- 【转载】java读取.properties配置文件的几种方法
读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...
- ArchLinux简单介绍
一.Archlinux的由来 2002年由加拿大的Judd Vinet,Archlinux的创始人 怀着对Debian.Redhat的包管理器不满,于是创建了Archlinux!目前ArchLinux ...
- win10、win7 使用centos配置网络,可以让Xshell进行连接,虚拟机进行上网;
系统:window 10 虚拟机VMware® Workstation 15 Pro Linux版本:CentOS-6.3 前提:关闭防火墙 如果是win7 系统可以不用第八步,如果不行可以试一下第八 ...
- 2.2 SVN的简单使用
1.打开SVN服务器 选中Repositories→右键→Create new Repositories 选中Test2→右键→Copy URL to Clipboard 打开记事本粘贴地址:http ...
- HDU - 1043 - Eight / POJ - 1077 - Eight
先上题目: Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- list转map工具类,根据指定的字段分组
import org.apache.log4j.Logger; import java.lang.reflect.Method;import java.util.ArrayList;import ja ...