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: 我也不知道题目名字是什么 线段树+离线的更多相关文章

  1. BZOJ 4491: 我也不知道题目名字是什么

    4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 278  Solved: 154[Submit][Status][ ...

  2. BZOJ 4491: 我也不知道题目名字是什么 RMQ

    4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 317  Solved: 174[Submit][Status][ ...

  3. 【BZOJ4491】我也不知道题目名字是什么 [线段树]

    我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...

  4. 【BZOJ4991】我也不知道题目名字是什么(线段树)

    [BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...

  5. bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)

    bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...

  6. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

  7. BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)

    LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...

  8. [NOI2018]你的名字(后缀自动机+线段树)

    题目描述 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的,ION 命题手 ...

  9. BZOJ5417[Noi2018]你的名字——后缀自动机+线段树合并

    题目链接: [Noi2018]你的名字 题目大意:给出一个字符串$S$及$q$次询问,每次询问一个字符串$T$有多少本质不同的子串不是$S[l,r]$的子串($S[l,r]$表示$S$串的第$l$个字 ...

随机推荐

  1. Java连载36-IDE使用

    一.主方法注意 每一个类都可以编写一个主方法,但是一般情况下,一个系统只有一个入口,所以主方法一般写一个 二.Myeclipse的使用 1.在workspace中工作区中有一个文件夹.metadata ...

  2. 大话设计模式Python实现-原型模式

    原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 一个原型模式的简单demo: #!/usr/bin/env python # -*- c ...

  3. 快速入门:Python简单实例100个(入门完整版)

    Python3 100例 文章目录 Python3 100例 实例001:数字组合 实例002:“个税计算” 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契 ...

  4. 2019.11.21 做OJ题的反思

    1.利用二分法查找数组元素(适用于有序数组) #include<stdio.h> int BinarySearch(int a[],int n,int key); ]; int main( ...

  5. windows上mysql解压缩版本、centos上rpm方式的安装、初始化等

    一.windows版本: https://dev.mysql.com/doc/refman/5.7/en/windows-install-archive.html 启动或者暂停mysql服务: htt ...

  6. mycat 白话配置

    1.server.xml <user name="root" defaultAccount="true"> <property name=&q ...

  7. MySQL for OPS 06:备份恢复

    写在前面的话 人在河边走,湿鞋是早晚是事情,操作服务器,数据库也一样.谁也不知道自己哪一天控制不住自己就手贱.这时候有两个东西能救我们,一是备份,二是 bin log,bin log 前面讲了,但是 ...

  8. 最简单取得外网IP

    #coding=utf-8import urllib2import re print re.search('\d+\.\d+\.\d+\.\d+',urllib2.urlopen("http ...

  9. 简单的python GUI例子

    写一个简单的界面很容易,即使是什么都不了解的情况下,这个文本转载了最简单的界面编写,下个文本介绍了TK的简单但具体的应用 在python中创建一个窗口,然后显示出来. from Tkinter imp ...

  10. scrapy框架抓取表情包/(python爬虫学习)

    抓取网址:https://www.doutula.com/photo/list/?page=1 1.创建爬虫项目:scrapy startproject biaoqingbaoSpider 2.创建爬 ...