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\)到根节点的 ...
随机推荐
- Qt无法用UTF-8编辑问题
原因: Windows默认编码格式是GBK. 而QT-各默认版本的编码格式是UTF-8. 解决方法": Windows环境下,Qt Creator,菜单->工具->选项-> ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- 使用 C# 进行 HTTP 操作
说明 主要使用到了 Newtonsoft.Json 和 System.Net 两个命名空间. Program.cs static void Main(string[] args) { WebOpert ...
- mvc重定向
出处 : https://www.cnblogs.com/lgxlsm/p/5441149.html .重定向方法:Redirect / RedirectToAction / RedirectToRo ...
- jq 替换DOM layeui 不刷新
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Docker 数据卷重复挂载测试
没想到一年没写博客了,这中间都是记在自己的笔记本上,大部分网上都有,这个好像没有,所以发上来吧! 本文是测试Docker容器(相同目录/父子目录)同时挂载到宿主机(同目录/不同目录)时的情况,废话少说 ...
- Mysql 之实现多字段模糊查询
在一个table中有省,市,县,期,栋,单元,室几个字段,然后用户输入一个地址从表中的字段拼接起来进行模糊查询. 解决办法: <MySQL权威指南>中CONCAT的使用方法,在书中的对CO ...
- 初识 Django
HTTP协议 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...
- jquery获取当前时间并且格式化
Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1 ...
- eas之视图冻结与解冻
// 冻结视图 table.getViewManager().freeze(verticalIndex, horizonIndex); //冻结视图:该方法在table还没显示的时候使用,也就是该方法 ...