2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门
题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串。
思路:
注意要求的是子串而不是子序列!!!
然后直接用线段树维护最大子段和的方式合并一下就完了。
注意要维护当前区间最靠左/右的数是什么。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=50005;
int n,a[N];
inline int max(const int&a,const int&b){return a>b?a:b;}
inline int max(const int&a,const int&b,const int&c){return a>b?(a>c?a:c):(b>c?b:c);}
namespace SGT{
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
struct Val{
int L,R,len,ls[2],rs[2],ms[2];
friend inline Val operator+(const Val&a,const Val&b){
Val ret;
ret.L=a.L,ret.R=b.R,ret.len=a.len+b.len;
ret.rs[0]=b.rs[0]+(b.rs[0]==b.len&&a.R<=b.L?a.rs[0]:0);
ret.rs[1]=b.rs[1]+(b.rs[1]==b.len&&a.R>=b.L?a.rs[1]:0);
ret.ls[0]=a.ls[0]+(a.ls[0]==a.len&&a.R<=b.L?b.ls[0]:0);
ret.ls[1]=a.ls[1]+(a.ls[1]==a.len&&a.R>=b.L?b.ls[1]:0);
ret.ms[0]=max(a.ms[0],b.ms[0],a.R<=b.L?a.rs[0]+b.ls[0]:0);
ret.ms[1]=max(a.ms[1],b.ms[1],a.R>=b.L?a.rs[1]+b.ls[1]:0);
return ret;
}
inline void Set(const int&x){L=R=x,len=ls[0]=rs[0]=ms[0]=ls[1]=rs[1]=ms[1]=1;}
};
struct Node{int l,r;Val val;}T[N<<2];
inline void pushup(int p){T[p].val=T[lc].val+T[rc].val;}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(l==r)return T[p].val.Set(a[l]);
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline Val query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return T[p].val;
if(qr<=mid)return query(lc,l,mid,ql,qr);
if(ql>mid)return query(rc,mid+1,r,ql,qr);
return query(lc,l,mid,ql,mid)+query(rc,mid+1,r,mid+1,qr);
}
#undef lc
#undef rc
#undef mid
}
int main(){
n=read();
for(ri i=1;i<=n;++i)a[i]=read();
SGT::build(1,1,n);
SGT::Val tmp;
for(ri tt=read(),l,r;tt;--tt){
l=read(),r=read(),tmp=SGT::query(1,1,n,l,r);
cout<<max(tmp.ms[0],tmp.ms[1])<<'\n';
}
return 0;
}
2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)的更多相关文章
- 【BZOJ4491】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- BZOJ 4491: 我也不知道题目名字是什么 线段树+离线
code: #include <string> #include <cstring> #include <cstdio> #include <algorith ...
- BZOJ4491: 我也不知道题目名字是什么
Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一 ...
- 【BZOJ4991】我也不知道题目名字是什么(线段树)
[BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...
- BZOJ 4491: 我也不知道题目名字是什么
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 278 Solved: 154[Submit][Status][ ...
- BZOJ 4491: 我也不知道题目名字是什么 RMQ
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 317 Solved: 174[Submit][Status][ ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- 2019年CCPC网络赛 HDU 6703 array【权值线段树】
题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...
- Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)
题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...
随机推荐
- Packet Tracer路由器简单配置
路由器Router2:Router>enable 进入特权模式Router#configure terminal 进入全局配置模式Router(config)#hostname RA 将路由器名 ...
- Filter过滤器 不登陆无法访问其他页面
package com.cscy.Filter; import java.io.IOException; import javax.servlet.Filter; import javax.servl ...
- pytorch1.0 安装执行后报错ImportError: No module named future.utils
File "/usr/local/lib/python2.7/dist-packages/caffe2/python/utils.py", line 10, in <modu ...
- Java8内置的函数式接口
JDK 1.8 API 包含了很多内置的函数式接口.其中就包括我们在老版本中经常见到的 Comparator 和 Runnable,Java 8 为他们都添加了 @FunctionalInterfac ...
- Commons Daemon procrun stdout initialized
参考 https://blog.csdn.net/qq_19865749/article/details/69664979 jvm路径错误
- 数据结构python编程总结
大数据.空间限制 布隆过滤器 使用很少的空间就可以将准确率做到很高的程度(网页黑名单系统.垃圾邮件过滤系统.爬虫的网址判重系统等) 有一定的失误率 单个样本的大小不影响布隆过滤器的大小 n个输入.k个 ...
- 电话号自动识别之bug解决汇总
今天测试一个defect: “联系我们”页显示的电话号码,在不同浏览器显示效果不统一,有些浏览器自动识别电话号码并强制添加了样式. 网络搜索发现,其它website 也有类似问题,例如:http:// ...
- 转-CVE-2016-10190浅析-FFmpeg堆溢出漏洞
本文转载自CVE-2016-10190 FFmpeg Heap Overflow 漏洞分析及利用 前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFm ...
- 我在Python学习中遇到的问题一
开发工具:PyCharm 系统:macOs Serria 10.12.4 jetbrains出品,作为和idea一个公司的兄弟产品,延续了idea的易用性,并且操作按钮也基本一致 一. 执行环境问题 ...
- jsp请求java返回pdf、excel与word
1,返回pdf关键代码 /** * @todo * @param * @date 2019年3月8日 * @author yanan */ @RequestMapping("/getPdf& ...