[***]HZOJ 优美序列
又是一道神仙题。考试的时候居然打了一个回滚莫队,不知道我咋想的……
先说一个某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 优美序列的更多相关文章
- 优美序列(sequence)
问题描述 Lxy养了N头奶牛,他把N头奶牛用1..N编号,第i头奶牛编号为i.为了让奶牛多产奶,每天早上他都会让奶牛们排成一排做早操.奶牛们是随机排列的.在奶牛排列中,如果一段区间[L,R]中的数从小 ...
- 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列
T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...
- [JZOJ6279] 2019.8.5【NOIP提高组A】优美序列
题目 题目大意 给你一个排列以及若干区间,对于每个区间,问包含它的最小的优美序列的区间. 所谓优美序列,即将权值排序后能够得到连续的排列. 思考历程 优美序列显然满足这个条件:\(mx-mn=r-l\ ...
- NOIP模拟测试13「矩阵游戏·跳房子·优美序列」
矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...
- 【模拟8.05】优美序列(线段树 分块 ST算法)
如此显然的线段树,我又瞎了眼了 事实上跟以前的奇袭很像....... 只要满足公式maxn-minn(权值)==r-l即可 所以可以考虑建两颗树,一棵节点维护位置,一棵权值, 每次从一棵树树上查询信息 ...
- [LeetCode] Beautiful Arrangement 优美排列
Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...
- dir命令只显示文件名
dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...
- 全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
题目名称 改造二叉树 数字对 交换 英文名称 binary pair swap 输入文件名 binary.in pair.in swap.in 输出文件名 binary.out pair.out sw ...
- NOIP模拟 13
我终于又厚颜无耻地赖着没走 ...... T1 矩阵游戏 用了30hmin找规律,然后发现貌似具有交换律,然后发现貌似有通项公式,然后发现貌似每次操作对通项的影响是相同的,然后发现貌似跟N没啥关系.. ...
随机推荐
- mysql limit的使用方法
mysql的分页limit的使用方法大全 .取表中的n行之后的m条元组(limit n,m) ,; //取出student表中第4行后的8条元组(这里的区间是左开右闭) .取出表中前m行元素(limi ...
- Binder对象死亡通知机制
本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/bin ...
- OpenLayers添加地图标记
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- CentOS7安装步骤
CentOS7安装详解 本文基于vmware workstations进行CentOS7安装过程展示,关于vmware workstations安装配置本人这里不再介绍,基本过程相当于window ...
- Pyhton AES_cbc解密
最近很多朋友问我加密解密有没有啥好推荐的方式,一般对AES的加密解密方式直接用在线加密或者解密就行,我为了方便测试,将网址以python脚本的形式写了出来,很简单的东西,2分钟搞定,随手记录一下~~ ...
- 海胜专访--MaxCompute 与大数据查询引擎的技术和故事
摘要:在2019大数据技术公开课第一季<技术人生专访>中,阿里巴巴云计算平台高级技术专家苑海胜为大家分享了<MaxCompute 与大数据查询引擎的技术和故事>,主要介绍了Ma ...
- 【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]最大; [题解] /* 有一个要 ...
- 大数据技术之Hadoop(HDFS)
第1章 HDFS概述 1.1 HDFS产出背景及定义 1.2 HDFS优缺点 1.3 HDFS组成架构 1.4 HDFS文件块大小(面试重点) 第2章 HDFS的Shell操作(开发重点) 1.基本语 ...
- day39-Spring 06-Spring的AOP:带有切点的切面
环绕增强功能是最强的,它相当于前置增强和后置增强. 这就是带有切点的切面 package cn.itcast.spring3.demo4; import org.aopalliance.interce ...
- iOS 三种打电话方式
//1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 NSMutableString * str=[[NSMutableString alloc] initWit ...