BZOJ 4491: 我也不知道题目名字是什么 线段树+离线
code:
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define N 50003
#define lson now<<1
#define rson now<<1|1
#define inf 100000000
using namespace std;
void setIO(string s) {
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
int n;
int sm[N];
int bg[N];
int pos[N];
int val[N];
int mx[N<<2];
int mn[N<<2];
int answer[N];
struct node {
int x;
int id;
node(int x=0,int id=0):x(x),id(id){}
}a[N<<1];
struct data {
int l,r,id;
data(int l=0,int r=0,int id=0):l(l),r(r),id(id){}
}e[N];
bool cmp(node a,node b) {
return a.x==b.x?a.id<b.id:a.x<b.x;
}
bool cmp_data(data a,data b) {
return a.r<b.r;
}
void build(int l,int r,int now) {
if(l==r) {
mn[now]=inf;
mx[now]=-inf;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
}
void fix_mn(int l,int r,int now,int p,int v) {
if(l==r) {
mn[now]=v;
return;
}
int mid=(l+r)>>1;
if(p<=mid) {
fix_mn(l,mid,lson,p,v);
}
else {
fix_mn(mid+1,r,rson,p,v);
}
mn[now]=min(mn[lson],mn[rson]);
}
void fix_mx(int l,int r,int now,int p,int v) {
if(l==r) {
mx[now]=v;
return;
}
int mid=(l+r)>>1;
if(p<=mid) {
fix_mx(l,mid,lson,p,v);
}
else {
fix_mx(mid+1,r,rson,p,v);
}
mx[now]=max(mx[lson],mx[rson]);
}
int que_mn(int l,int r,int now,int L,int R) {
if(l>=L&&r<=R) {
return mn[now];
}
int mid=(l+r)>>1,re=inf;
if(L<=mid) {
re=min(re,que_mn(l,mid,lson,L,R));
}
if(R>mid) {
re=min(re,que_mn(mid+1,r,rson,L,R));
}
return re;
}
int que_mx(int l,int r,int now,int L,int R) {
if(l>=L&&r<=R) {
return mx[now];
}
int mid=(l+r)>>1,re=-inf;
if(L<=mid) {
re=max(re,que_mx(l,mid,lson,L,R));
}
if(R>mid) {
re=max(re,que_mx(mid+1,r,rson,L,R));
}
return re;
}
int main() {
// setIO("input");
int i,j,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;++i) {
scanf("%d",&val[i]);
}
pos[n]=sm[n]=bg[n]=n;
for(i=n-1;i>=1;--i) {
sm[i]=(val[i+1]<=val[i]?sm[i+1]:i);
bg[i]=(val[i+1]>=val[i]?bg[i+1]:i);
pos[i]=max(sm[i],bg[i]);
a[++cnt]=node(i,0);
a[++cnt]=node(pos[i],i);
}
sort(a+1,a+1+cnt,cmp);
int q;
scanf("%d",&q);
for(i=1;i<=q;++i) {
scanf("%d%d",&e[i].l,&e[i].r);
e[i].id=i;
}
sort(e+1,e+1+q,cmp_data);
build(1,n,1);
for(i=j=1;i<=q;++i) {
while(j<=cnt&&a[j].x<=e[i].r) {
if(a[j].id) {
fix_mn(1,n,1,a[j].id,inf);
fix_mx(1,n,1,a[j].id,a[j].x-a[j].id+1);
}
else {
fix_mn(1,n,1,a[j].x,a[j].x);
}
++j;
}
answer[e[i].id]=max(e[i].r-que_mn(1,n,1,e[i].l,e[i].r)+1, que_mx(1,n,1,e[i].l,e[i].r));
}
for(i=1;i<=q;++i) {
printf("%d\n",answer[i]);
}
return 0;
}
BZOJ 4491: 我也不知道题目名字是什么 线段树+离线的更多相关文章
- 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】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- 【BZOJ4991】我也不知道题目名字是什么(线段树)
[BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...
- bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)
bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...
- [NOI2018]你的名字(后缀自动机+线段树)
题目描述 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的,ION 命题手 ...
- BZOJ5417[Noi2018]你的名字——后缀自动机+线段树合并
题目链接: [Noi2018]你的名字 题目大意:给出一个字符串$S$及$q$次询问,每次询问一个字符串$T$有多少本质不同的子串不是$S[l,r]$的子串($S[l,r]$表示$S$串的第$l$个字 ...
随机推荐
- 游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...
- java 常见高级开发面试题 非算法等特定岗 一
基础1.List和Set区别 List:1.可以允许重复的对象. 2.可以插入多个null元素. 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序. 4.常用的实现类有 Arra ...
- 题目:利用Calendar类计算自己的出生日期距今天多少天,再将自己的出生日期利用SimpleDateFormat类设定的格式输出显示
package cn.exercise; import java.util.Calendar; import java.util.Date; import java.text.SimpleDateFo ...
- Shell基本运算符之文件测试符
文件测试运算符 ================摘自菜鸟教程================= 文件测试运算符用于检测UNIx文件的各种属性: 操作符 说明 例子 -b 检测文件是否是块设备文件,如果 ...
- 基于仿射的非刚体配准方法(i) 法向
为啥闲呢,因为work干完了. 为啥补档呢,因为有新work了. 呃,因为新work让人自闭. 我现在干完了两部分.一是把最近邻的部分迁移过来. 二是求法向. 首先是给三个点,就能确定平面——因为是三 ...
- Windows Server 2008 R2 install Visual Studio 2015 failed
Please download and install Windows Server 2008 R2 Service Pack 1 (KB976932) . https://www.microsoft ...
- Linux入门——初识Linux
Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...
- js中this由来
这篇文章主要是讲述js中的this是什么?是怎么来的? 我们首先创建一个person对象,如下: var person = { name: 'wyh', age: 22, sayHi: functio ...
- maven 学习---将项目安装到Maven本地资源库
在Maven中,可以使用“mvn install”打包项目,并自动部署到本地资源库,让其他开发人员使用它. mvn install 注意,当“install”在执行阶段,上述所有阶段 “validat ...
- Vue-组件模板抽离的写法
VUE的模板分离写法. 1.第一种(不常用) <script type="text/x-template" id="myCpm"> <div& ...