【题意】给定长度为n的排列,m次询问区间[L,R]的最长连续值域。n<=50000。

【算法】莫队算法

【题解】考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[x]表示数值x往下延伸的最大长度。

增加一个数x时,up[x]=up[x+1]+1,down[x]=down[x-1]+1。令t=up[x]+down[x]+1,可以用于更新答案。

同时,增加x后会影响到x所在连续区间最大数和最小数,中间的数字不会影响后面的答案(因为只考虑加数,中间的数字虽然改变但不会被调用),所以有:

down[x+up[x]-1] = up[x-down[x]+1] = t

回顾莫队算法的复杂度分析。莫队算法按左端点分块,块内按右端点排序。假设块大小为B,左端点复杂度O(B*q),右端点复杂度O(n/B*n)。

实际上,我们只需要保证每次询问左端点复杂度为O(B),每一块询问右端点复杂度为O(n)就可以了。

既然只需要每次询问左端点复杂度为O(B),干脆不用删点的操作实现,改成暴力加点实现。

记块的右端点的r,对于同一块的询问,将>r的右端点逐渐增加向右扩展并累计。对于每次询问,暴力增加块内的部分至询问左端点处,用栈记录修改,做完后清除。

复杂度O(n√m)。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int a[maxn],ANS[maxn],s1[maxn*],s2[maxn*],up[maxn],down[maxn],top,ans,answer;
int n,m;
struct cyc{int l,r,q,id;}b[maxn];
bool cmp(cyc x,cyc y){return x.q^y.q?x.q<y.q:x.r<y.r;}
void modify(int x){
up[x]=up[x+]+;
down[x]=down[x-]+;
int t=up[x]+down[x]-;
s1[++top]=x+up[x]-;s2[top]=down[s1[top]];
s1[++top]=x-down[x]+;s2[top]=up[s1[top]];
down[s1[top-]]=up[s1[top]]=t;
ans=max(ans,t);
}
int main(){
scanf("%d%d",&n,&m);
int Q=(int)(1.0*n/sqrt(m));
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++){scanf("%d%d",&b[i].l,&b[i].r);b[i].q=(b[i].l-)/Q+;b[i].id=i;}
sort(b+,b+m+,cmp);
int r=,t=;
for(int i=;i<=m;i++){
if(b[i].q!=b[i-].q){
memset(up,,sizeof(up));
memset(down,,sizeof(down));
t=r=b[i].q*Q;answer=;
}
ans=;top=;
while(b[i].r>r)modify(a[++r]);
top=;//forget...
answer=ans=max(answer,ans);
for(int j=b[i].l;j<=min(t,b[i].r);j++)modify(a[j]);
ANS[b[i].id]=ans;
for(int j=top;j>=;j--)if(j%)down[s1[j]]=s2[j];else up[s1[j]]=s2[j];
for(int j=b[i].l;j<=min(t,b[i].r);j++)up[a[j]]=down[a[j]]=;
}
for(int i=;i<=m;i++)printf("%d\n",ANS[i]);
return ;
}

注意:栈数组开2倍

还有想着后面要记得写的东西可以先写到草稿纸上,不然后面忘了……GG

【BZOJ】4358: permu 莫队算法的更多相关文章

  1. bzoj 4358 Permu - 莫队算法 - 链表

    题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...

  2. bzoj 4358: permu 莫队

    第一步先莫队分块. 对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原. 具体来说是维护两个数组now1和now2,一个 ...

  3. BZOJ 3757 苹果树 ——莫队算法

    挺好的一道题目,怎么就没有版权了呢?大数据拍过了,精神AC.... 发现几种颜色这性质比较垃圾,不可加,莫队硬上. %了一发popoqqq大神的博客, 看了一波VFK关于糖果公园的博客, 又找了wjm ...

  4. bzoj 2038(莫队算法)

    2038: [2009国家集训队]小Z的袜子(hose) 时间限制: 20 Sec  内存限制: 259 MB 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来 ...

  5. BZOJ 4358 坑 莫队+线段树 死T

    这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...

  6. bzoj 2038 A-小Z的袜子[hose] - 莫队算法

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...

  7. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

  8. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  9. Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...

随机推荐

  1. DNS服务器的解析

    ---恢复内容开始--- DNS前言: 英特网作为域名和IP地址相互映射的一个分不式数据库,能够使用户更方便的访问互联网.而不用去记住能够被机器直接读取的IP地址的过程叫做域名解析(或主机名解析).D ...

  2. "firstday"-软件工程

    阅读以下文章 http://www.thea.cn/news/terminal/9/9389.html    http://www.shzhidao.cn/system/2015/09/22/0102 ...

  3. centos系统下禁用笔记本触控板

    最近把零几年的老爷笔记本拿出来用,使用windows系统实在太卡了,于是折腾安装上Centos系统了,但是在使用的过程中发现鼠标经常失效.使用了多种方法(比如:http://blog.csdn.net ...

  4. mysql 慢查询,查询缓存,索引,备份,水平分割

    1.开启慢查询 在mysql的配置文件my.ini最后增加如下命令 [mysqld]port=3306slow_query_log =1long_query_time = 1 2.查看慢查询记录 默认 ...

  5. Spring Security 入门详解

    序:本文主要参考 spring实战 对里面的知识做一个梳理 1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完 ...

  6. 解决Qt creator无法输入中文

    详细的方法来自以下网址: http://my.oschina.net/lieefu/blog/505363?p={{currentPage+1}} 需要说明的几点: 设置qmake 的路径使用自身的路 ...

  7. java 父类的引用调用自己的属性 但是调用的方法必须是重写过的父类的方法 因为编译时候把他当作父类 运行时候才是他自己 所以必须重写父类得方法

  8. Codeforces 618D Hamiltonian Spanning Tree(树的最小路径覆盖)

    题意:给出一张完全图,所有的边的边权都是 y,现在给出图的一个生成树,将生成树上的边的边权改为 x,求一条距离最短的哈密顿路径. 先考虑x>=y的情况,那么应该尽量不走生成树上的边,如果生成树上 ...

  9. BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)

    图中的保护关系就类似于最大权闭合子图.即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边.那么题目就转化成了最大权闭合子图的问题. 但是这个图有点特殊啊... 考虑有环的情况,显然这个环以 ...

  10. Spring Boot系列教程九:Spring boot集成Redis

    一.创建项目 项目名称为 “springboot_redis”,创建过程中勾选 “Web”,“Redis”,第一次创建Maven需要下载依赖包(耐心等待) 二.实现 properties配置文件中添加 ...