又是一道神仙题。考试的时候居然打了一个回滚莫队,不知道我咋想的……

先说一个某OJT80,洛谷T5分的思路(差距有点大):

可以把位置和编号映射一下,区间内最大值和最小值对应的位置,每次更新,直到找到符合条件的情况,复杂度玄学。最值的维护可以用ST表或者线段树,前者复杂度低些。

然后说正解吧:

先放出来看不懂的作者的正解:

分治法,离线处理。假设现在处理的询问都包含在[L,R] 中,设mid=(L+R)/2。然后将包含在[L,mid],[mid+1,R] 的区间分治处理。剩下的就是包含[mid,mid+1] [mid,mid+1]的询问,然后找出包含[mid,mid+1] [mid,mid+1]的所有优美区间,用这些优美区间更新询问的答案。

时间复杂度O(n(logn)^2)。

上面的我不会。

然后正解1:scc+线段树优化建图

但是我不会……

正解2:

扫描线+转化思想+线段树,虽然我不会扫描线(我还以为这玩意只能用到二维呢)……

1.好的区间的交也是好的区间

2.好的区间的并也是好的区间

好的区间的判断条件:maxn-minn=r-l,但是这样并不够,如果只是这样判断的话,就回到了80分的思路,不断拓展区间判断。

另一个判断条件是l+num=r,num为区间中形如(a,a+1)这样的点对数(将区间排序后就很显然了)。

所以我们离线将询问排序扔到set里,固定r,然后用线段树维护左边的信息及对应的l,令叶子节点的初始值为l,查询只需要找线段树中满足条件最靠右的,而每次r右移,给1~b[a[r]+-1]的区间的点对数+1,当然要判断一下,必须在它左边。

其实我开始有一个问题,如果固定r,能保证区间的右端点一定是r吗?显然是不能的,但是在处理r时,如果没有满足条件的l,这个询问就会被剩到set中,在r+1后继续更新,就保证了正确性。

 #include<algorithm>
#include<iostream>
#include<cstdio>
#include<set>
#define LL long long
#define MAXN 1000010
using namespace std;
struct ques
{
int l,r,id;
friend bool operator < (ques a,ques b)
{return a.l==b.l?(a.r==b.r?a.id<b.id:a.r>b.r):a.l>b.l;}
}q[MAXN];
set<ques> s;
set<ques>::iterator it;
pair<int,int>ans[MAXN];
int n,m,a[MAXN],b[MAXN];
struct po
{
int mx,id;
friend bool operator < (po a,po b)
{return a.mx==b.mx?a.id<b.id:a.mx<b.mx;}
};
struct tree
{
po v;int ad,l,r;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define ad(x) tr[x].ad
#define v(x) tr[x].v
#define ls(x) (x<<1)
#define rs(x) (ls(x)+1)
}tr[MAXN*];
void pushup(int x)
{
v(x)=max(v(ls(x)),v(rs(x)));
}
void down(int x)
{
if(!ad(x))return;
ad(ls(x))+=ad(x);
ad(rs(x))+=ad(x);
v(ls(x)).mx+=ad(x);
v(rs(x)).mx+=ad(x);
ad(x)=;
}
void build(int x,int l,int r)
{
l(x)=l,r(x)=r;
if(l==r)
{v(x).id=v(x).mx=l;ad(x)=;return;}
int mid=(l+r)>>;
build(ls(x),l,mid);
build(rs(x),mid+,r);
pushup(x);
}
void add(int x,int l,int r,int y)
{
if(l(x)>=l&&r(x)<=r)
{v(x).mx+=y;ad(x)+=y;return;}
down(x);
int mid=(l(x)+r(x))>>;
if(l<=mid)add(ls(x),l,r,y);
if(r>mid) add(rs(x),l,r,y);
pushup(x);
}
po ask(int x,int l,int r)
{
down(x);
if(l(x)>=l&&r(x)<=r)return v(x);
int mid=(l(x)+r(x))>>;po ans={-,-};
if(l<=mid)ans=max(ans,ask(ls(x),l,r));
if(r>mid) ans=max(ans,ask(rs(x),l,r));
return ans;
}
bool cmp(ques a,ques b)
{
return a.r<b.r;
}
inline int read();
signed main()
{
// freopen("in.txt","r",stdin); n=read();
for(int i=;i<=n;i++)a[i]=read(),b[a[i]]=i;
m=read();
for(int i=;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+,q+m+,cmp);
build(,,n);
int ptr=;
for(int i=;i<=n;i++)
{
while(ptr<=m&&q[ptr].r==i)
s.insert(q[ptr]),ptr++;
if(a[i]>&&b[a[i]-]<i)add(,,b[a[i]-],);
if(a[i]<n&&b[a[i]+]<i)add(,,b[a[i]+],);
while(s.size())
{
ques now=*s.begin();
po tem=ask(,,now.l);
if(tem.mx!=i)break;
ans[now.id].first=tem.id;
ans[now.id].second=i;
s.erase(now);
}
}
for(int i=;i<=m;i++)
printf("%d %d\n",ans[i].first,ans[i].second);
}
inline int read()
{
int s=;char a=getchar();
while(a<''||a>'')a=getchar();
while(a>=''&&a<=''){s=s*+a-'',a=getchar();}
return s;
}

 声讨某ex_face一干人等卡分快调块长卡掉数据

[***]HZOJ 优美序列的更多相关文章

  1. 优美序列(sequence)

    问题描述 Lxy养了N头奶牛,他把N头奶牛用1..N编号,第i头奶牛编号为i.为了让奶牛多产奶,每天早上他都会让奶牛们排成一排做早操.奶牛们是随机排列的.在奶牛排列中,如果一段区间[L,R]中的数从小 ...

  2. 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列

    T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...

  3. [JZOJ6279] 2019.8.5【NOIP提高组A】优美序列

    题目 题目大意 给你一个排列以及若干区间,对于每个区间,问包含它的最小的优美序列的区间. 所谓优美序列,即将权值排序后能够得到连续的排列. 思考历程 优美序列显然满足这个条件:\(mx-mn=r-l\ ...

  4. NOIP模拟测试13「矩阵游戏&#183;跳房子&#183;优美序列」

    矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...

  5. 【模拟8.05】优美序列(线段树 分块 ST算法)

    如此显然的线段树,我又瞎了眼了 事实上跟以前的奇袭很像....... 只要满足公式maxn-minn(权值)==r-l即可 所以可以考虑建两颗树,一棵节点维护位置,一棵权值, 每次从一棵树树上查询信息 ...

  6. [LeetCode] Beautiful Arrangement 优美排列

    Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...

  7. dir命令只显示文件名

    dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...

  8. 全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中

    题目名称 改造二叉树 数字对 交换 英文名称 binary pair swap 输入文件名 binary.in pair.in swap.in 输出文件名 binary.out pair.out sw ...

  9. NOIP模拟 13

    我终于又厚颜无耻地赖着没走 ...... T1 矩阵游戏 用了30hmin找规律,然后发现貌似具有交换律,然后发现貌似有通项公式,然后发现貌似每次操作对通项的影响是相同的,然后发现貌似跟N没啥关系.. ...

随机推荐

  1. mysql limit的使用方法

    mysql的分页limit的使用方法大全 .取表中的n行之后的m条元组(limit n,m) ,; //取出student表中第4行后的8条元组(这里的区间是左开右闭) .取出表中前m行元素(limi ...

  2. Binder对象死亡通知机制

    本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码:        ~/Android/frameworks/base/libs/bin ...

  3. OpenLayers添加地图标记

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  4. CentOS7安装步骤

    CentOS7安装详解   本文基于vmware workstations进行CentOS7安装过程展示,关于vmware workstations安装配置本人这里不再介绍,基本过程相当于window ...

  5. Pyhton AES_cbc解密

    最近很多朋友问我加密解密有没有啥好推荐的方式,一般对AES的加密解密方式直接用在线加密或者解密就行,我为了方便测试,将网址以python脚本的形式写了出来,很简单的东西,2分钟搞定,随手记录一下~~ ...

  6. 海胜专访--MaxCompute 与大数据查询引擎的技术和故事

    摘要:在2019大数据技术公开课第一季<技术人生专访>中,阿里巴巴云计算平台高级技术专家苑海胜为大家分享了<MaxCompute 与大数据查询引擎的技术和故事>,主要介绍了Ma ...

  7. 【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring

    [链接]h在这里写链接 [题意] 给你n个数字; 让你在其中找出三个数字i,j,k(i<=j<=k); 使得p*a[i]+q*a[j]+r*a[k]最大; [题解] /*     有一个要 ...

  8. 大数据技术之Hadoop(HDFS)

    第1章 HDFS概述 1.1 HDFS产出背景及定义 1.2 HDFS优缺点 1.3 HDFS组成架构 1.4 HDFS文件块大小(面试重点) 第2章 HDFS的Shell操作(开发重点) 1.基本语 ...

  9. day39-Spring 06-Spring的AOP:带有切点的切面

    环绕增强功能是最强的,它相当于前置增强和后置增强. 这就是带有切点的切面 package cn.itcast.spring3.demo4; import org.aopalliance.interce ...

  10. iOS 三种打电话方式

    //1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 NSMutableString * str=[[NSMutableString alloc] initWit ...