[***]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没啥关系.. ...
随机推荐
- 【JZOJ5363】【NOIP2017提高A组模拟9.14】生命之树 Trie+启发式合并
题面 45 在比赛中,我只想到了45分的暴力. 对于一个树中点对,相当于在他们的LCA及其祖先加上这个点对的贡献. 那么这个可以用dfs序+树状数组来维护. 100 想法 我想到了可能要用trie树来 ...
- System V启动脚本启动的服务
/etc/rc.d/init.d/目录下的内容如下:这些常用的服务器都是System v的服务,要控制System V 的服务,我们可以使用以下命令 #/etc/rc.d/init.d/script ...
- 贝叶斯--旧金山犯罪分类预测和电影评价好坏 demo
来源引用:https://blog.csdn.net/han_xiaoyang/article/details/50629608 1.引言 贝叶斯是经典的机器学习算法,朴素贝叶斯经常运用于机器学习的案 ...
- pl/sql 语句块循环语句
---基本循环declarev1 number(2) :=1;begin loop dbms_output.put_line(v1); v1:=v1+1; exit when v1>10; -- ...
- 优化SQL之最佳索引
SQL优化工具Tosska SQL Tuning Expert for Oracle,帮助SQL开发人员解决SQL性能问题. 本工具主要创始人Richard To, 资深ITPUB元老,从1996年开 ...
- Python datetime模块的其他方法
- php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义
https://blog.csdn.net/weixin_42231483/article/details/81585322 最近用PHP的tp3.2.3框架和js写的微信分享功能心得,分享的标题内容 ...
- No.4 Verilog 表达式
4-1 操作数 常数.参数.线网.变量.位选.存储器.数组. *部分位选: integer mark; :] inst; :] gpio; inst[mark+ : ] //选择 mark,mark+ ...
- spring boot + mybatis 访问 neo4j
之前有通过rest的风格去访问,但是每次需要访问时候将statement一并加入header中去数据库执行,方式简单.且思路清晰,但是不便于形成模板调用,固采用mybaits来集成. 1.关键pom. ...
- 如何在 KiCad Eeschema 原理图中高亮网络
如何在 KiCad Eeschema 原理图中高亮网络 在 KiCad Pcbnew 中高度某个网络很方便,按着 Ctrl + 单击可以高度网络. 以为 Eeschema 也是一样的,按着 Ctrl ...