[***]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没啥关系.. ...
随机推荐
- E浏览器常见的9个css Bug以及解决办法
我们在浏览网页的时候经常看见这样的现象:某个网页在IE6浏览器中打开很正常,但是在IE8里面打开可能完全变形了.或者也有可能出现完全相反的现象.这让Web程序员及设计师往往为了其CSS在各个IE版本下 ...
- div代码大全 DIV代码使用说明
一.DIV代码语法 - TOP DIV代码是放入小于与大于符号内,即“<div>”. DIV是一对闭合标签,即“”开始,“结束”的盒子标签. 语法结构: <div>我是内容&l ...
- 学习Boost/Asio
编译boost 在Mac下使用brew编译boost,为了使用C++11,需要加入参数–c++11 $ brew install boost --c++11 在我的Mac虚拟机里面用了20分钟左右编译 ...
- 计蒜客 Prefix Free Code(字典树+树状数组)
Consider n initial strings of lower case letters, where no initial string is a prefix of any other i ...
- Dreamweaver CS5更改代码颜色方法代码
XP系统下: C:\Documents and Settings\Administrator\ApplicationData\Adobe\Dreamweaver CS4\zh_CN\Configura ...
- 部署 LAMP (CentOS 7.2)
摘自:https://help.aliyun.com/document_detail/50774.html 简介 LAMP指Linux+Apache+Mysql/MariaDB+Perl/PHP/Py ...
- 【水滴石穿】React-Redux-Demo
这个项目没有使用什么组件,可以理解就是个redux项目 项目地址为:https://github.com/HuPingKang/React-Redux-Demo 先看效果图 点击颜色字体颜色改变,以及 ...
- Mysql常用的三种数据库引擎比较
ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源.ISA ...
- PHP 中的 curl 函数发送 Post 请求应该注意的几点
public function http_request( $url, $post = '', $timeout = 5 ){ if( empty( $url ) ){return ;}$ch = c ...
- php中实现多线程的的两个方法具体是怎样?
假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转.你可能会写下面这样的代码:代码如下: <?php$hosts = array("host1.sample.com ...