问题: permu

时间限制: 30 Sec  内存限制: 512 MB

题面


题目描述

给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问。每次询问某个区间[l,r]中,最长的值域

连续段长度。

输入格式

第一行两个整数n,m。

接下来一行n个整数,描述P。

接下来m行,每行两个整数l,r,描述一组询问。

输出格式

对于每组询问,输出一行一个整数,描述答案。

样例输入

8 3
3 1 7 2 5 8 6 4
1 4
5 8
1 7

样例输出

3
3
4

题解


线段树+莫队。

考虑维护区间连续值域长度最大值。

首先显然莫队。(毕竟是蒟蒻我在莫队专题里遇到的题目……)

序列操作、多次询问,最关键的是无修!(没学过带修莫队不行啊 /理直气壮)

于是考虑怎么在不同区间内转移。

我们先种一棵值域线段树维护点的存在与否。

我们假设li为某段区间从左边界开始的最长值域连续段,ri为从右边界开始的最长值域连续段,mi为区间中最长值域连续段,考虑如何转移。

当push_up的时候,li由左儿子的li转移而来。特殊地,我们考虑左儿子整个区间连续,则li由左儿子的区间大小加上右儿子的li转移而来。

同理,ri由右儿子的ri转移。特殊情况为右儿子的区间大小加上左儿子的ri。

考虑mi的转移。显然mi由左儿子的mi和右儿子的mi以及左儿子的ri与右儿子的li组成的新区间转移而来。

注意我们开的是值域线段树,因此可以保证区间的连续性。

于是线段树维护3个标记我们就可以方便的进行转移了。

然后就是莫队板子。不断在线段树中插入点,删除点并进行转移统计答案。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define rint register int
using namespace std;
int n,m,a[],tk[],belong[],l,r,sum_q,ans[];
struct node1{int li,ri,mi,size;}t[];
struct node2{int l,r,id;}que[];
inline bool cmp(node2 a,node2 b)
{
return (belong[a.l]^belong[b.l])?belong[a.l]<belong[b.l]:((belong[a.l]&)?a.r<b.r:a.r>b.r);
}
inline void build(rint k,rint l,rint r)
{
if(l==r){t[k].size=;return ;}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
t[k].size=t[k<<].size+t[k<<|].size;
return ;
}
inline void update(rint k)
{
t[k].li=t[k<<].li;t[k].ri=t[k<<|].ri;
if(t[k<<].li==t[k<<].size)t[k].li+=t[k<<|].li;
if(t[k<<|].ri==t[k<<|].size)t[k].ri+=t[k<<].ri;
// cout<<"left:"<<t[k<<1].mi<<" right:"<<t[k<<1|1].mi<<" mid:"<<t[k<<1].ri+t[k<<1|1].li<<endl;
t[k].mi=max(max(t[k<<].mi,t[k<<|].mi),t[k<<].ri+t[k<<|].li);
}
inline void change(rint k,rint p,rint u,rint l,rint r)
{
// cout<<"change:"<<p<<endl;
if(l==u&&r==u)
{
// cout<<p<<endl;
t[k].mi=p;t[k].li=p;t[k].ri=p;
// cout<<"mi:"<<t[k].mi<<endl;
return ;
}
rint mid=(l+r)>>;
if(u<=mid)change(k<<,p,u,l,mid);
else change(k<<|,p,u,mid+,r);
update(k);//cout<<t[k].mi<<endl;
return ;
}
int main()
{
scanf("%d %d",&n,&m);
sum_q=(int)sqrt(n);
for(rint i=;i<=n;++i)
{
scanf("%d",&a[i]);
belong[i]=i/sum_q+;
}
build(,,n);
for(rint i=;i<=m;++i)
{
scanf("%d %d",&que[i].l,&que[i].r);
que[i].id=i;
}
sort(que+,que+m+,cmp);
for(rint i=que[].l;i<=que[].r;++i)
{
tk[a[i]]++;
if(tk[a[i]]==)change(,,a[i],,n);
}
ans[que[].id]=t[].mi;
l=que[].l,r=que[].r;
for(rint i=;i<=m;++i)
{
// cout<<l<<" "<<que[i].l<<endl;
while(l<que[i].l){tk[a[l]]--;if(tk[a[l]]==)change(,,a[l],,n);l++;}
// cout<<l<<" "<<que[i].l<<endl;
while(l>que[i].l){l--;tk[a[l]]++;if(tk[a[l]]==)change(,,a[l],,n);}
while(r<que[i].r){r++;tk[a[r]]++;if(tk[a[r]]==)change(,,a[r],,n);}
while(r>que[i].r){tk[a[r]]--;if(tk[a[r]]==)change(,,a[r],,n);r--;}
ans[que[i].id]=t[].mi;
}
for(rint i=;i<=m;++i)
cout<<ans[i]<<endl;
return ;
}

最开始没设初始区间调了半个小时……

ps:此题需要卡常,最好使用奇偶性排序法QAQ(18000(TLE63)->12000(AC))

「题解」:[BZOJ4358]permu的更多相关文章

  1. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  2. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  3. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  4. 「题解」:[loj2763][JOI2013]现代豪宅

    问题 A: 现代豪宅 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...

  5. 「题解」:$Six$

    问题 A: Six 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 来写一篇正经的题解. 每一个数对于答案的贡献与数本身无关,只与它包含了哪几个质因数有关. 所以考虑二 ...

  6. 「题解」:$Smooth$

    问题 A: Smooth 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 维护一个队列,开15个指针,对应前15个素数. 对于每一次添加数字,暴扫15个指针,将指针对应 ...

  7. 「题解」:Kill

    问题 A: Kill 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 80%算法 赛时并没有想到正解,而是选择了另一种正确性较对的贪心验证. 对于每一个怪,我们定义它的 ...

  8. 「题解」:y

    问题 B: y 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 考虑双向搜索. 定义$cal_{i,j,k}$表示当前已经搜索状态中是否存在长度为i,终点为j,搜索过边 ...

  9. 「题解」:x

    问题 A: x 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 赛时想到了正解并且对拍了很久.对拍没挂,但是评测姬表示我w0了……一脸懵逼. 不难证明,如果对于两个数字 ...

随机推荐

  1. 2、http请求与http响应

    我们在接口测试过程中,可能会用http协议,webservice协议,当然用的较多的还是http协议,webservice协议在此不做过多介绍,我们先了解一下http协议,然后重点介绍http请求与响 ...

  2. KNN与决策树

    KNN: 就是计算特征之间的距离,某一个待预测的数据分别与已知的所有数据计算他们之间的特征距离,选出前N个距离最近的数据,这N个数据中哪一类的数据最多,就判定待测数据归属哪一类. 假如N=3,图中待测 ...

  3. 图文形式分享网页到facebook (要求:可以多个图片切换选择)

    分享网页到facebook的功能很常见,之前都是简单的网页分享,没遇到什么砍儿.这次的需求相比之前有一丁点特殊,就是图片得是用户指定选择的. fb文档地址:https://developers.fac ...

  4. 19-MySQL-Ubuntu-数据表的查询-自关联(八)

    自关联   转自:https://blog.csdn.net/hubingzhong/article/details/81277220

  5. Selenium(二)---无界面模式+滑动底部

    一.使用无界面模式 1.正常情况启动 selenium 是有界面的 2.有些情况下,需要不显示界面,这时只要设置一下参数就可以实现了 # 不想显示界面可以用 Chrome——配置一下参数就好 from ...

  6. 2008年国外50个最佳CSS设计欣赏

    这50个CSS网站是由WebDesignerWall评选出来的,很具参考价值.我们在欣赏的同时,也能从中吸取很多灵感,也能从它们的源代码中学习更高级的CSS技术.今年,越来越多的设计师开始使用超大的背 ...

  7. StringBuilder 和 StringBuffer类

    通常在涉及到StringBuilder和StringBuffer时中任何一个时,都应该想到另外一个并且在脑海中问自己是否用另外一个更加合适. 为什么这么说,请继续往下看,当然如果你已经对二者烂熟于胸自 ...

  8. Apache Forbidden 403错误提示

    在配置Linux的 Apache服务时,经常会遇到http403错误,我今天配置测试时也出现了,最后解决了,总结了一下.http 403错误是拒绝访问的意思,有很多原因的.还有,这些问题在win平台的 ...

  9. 帆软报表PC端实施报表心得体会

    1.报表制作完成后,预览时自动显示查询内容,在控件处设置: 2.求一列数据的最小值(除去0),并对最小值字体加粗标绿,需要对对应单元格设置条件属性,并插入公式:C6 = min(greparray(C ...

  10. Java笔记 - Socket编程

    两个Java应用程序可以通过一个双向的网络通讯连接实现数据交换,这个双向链路的一端称为一个Socket.java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向链路的c ...