【BZOJ】4358: permu 莫队算法
【题意】给定长度为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 莫队算法的更多相关文章
- bzoj 4358 Permu - 莫队算法 - 链表
题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...
- bzoj 4358: permu 莫队
第一步先莫队分块. 对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原. 具体来说是维护两个数组now1和now2,一个 ...
- BZOJ 3757 苹果树 ——莫队算法
挺好的一道题目,怎么就没有版权了呢?大数据拍过了,精神AC.... 发现几种颜色这性质比较垃圾,不可加,莫队硬上. %了一发popoqqq大神的博客, 看了一波VFK关于糖果公园的博客, 又找了wjm ...
- bzoj 2038(莫队算法)
2038: [2009国家集训队]小Z的袜子(hose) 时间限制: 20 Sec 内存限制: 259 MB 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来 ...
- BZOJ 4358 坑 莫队+线段树 死T
这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...
- bzoj 2038 A-小Z的袜子[hose] - 莫队算法
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法
[题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...
随机推荐
- 奥特曼小分队之we are a team
团队名称:奥特曼小分队 团队博客链接:http://cnblogs.com/ATMXFD 团队负责跑腿的:李全清 http://www.cnblogs.com/QuanQingli/ 团队成员: 孙乐 ...
- lintcode-422-最后一个单词的长度
422-最后一个单词的长度 给定一个字符串, 包含大小写字母.空格' ',请返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 注意事项 一个单词的界定是,由字母组成,但不包含任何的空 ...
- Windows下IntelliJ IDEA中调试Spark Standalone
参考:http://dataknocker.github.io/2014/11/12/idea%E4%B8%8Adebug-spark-standalone/ 转载请注明来自:http://www.c ...
- word批量转pdf文件快捷方法。
最近在工作中因为要遇到大量的Word文件转化为PDF文件来实现平台的迁移.但是由于文件太多,手动很费力,想到了用代码的方式: 复制下面的代码,保存的记事本,另存为vbs文件:然后把这个vbs文件放到你 ...
- [C/C++] 快速幂讲解
转自:http://www.cnblogs.com/CXCXCXC/p/4641812.html 快速幂这个东西比较好理解,但实现起来到不老好办,记了几次老是忘,今天把它系统的总结一下防止忘记. 首先 ...
- 第99天:CSS3中透视perspective
CSS3中透视perspective 透视原理: 近大远小 . 浏览器透视:把近大远小的所有图像,透视在屏幕上. 理解浏览器的坐标系:浏览器平面为 Z=0的平面,坐标原点默认为图片的中心,可以通过更改 ...
- 【.Net】C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径
1.c#根据绝对路径获取 带后缀文件名.后缀名.文件名. 1 string str =" F:\test\Default.aspx"; 2 string filename = ...
- liunx vim常用操作命令
vim常用操作命令 vim abc // 打开该文件,或者新建文件 vim +3 abc // 打开文件并跳转到第三行 vim +/hello //打开文件并跳转到第一次出现hello的位置 vim ...
- 【JQuery】遍历
一.前言 接着上一章的内容,继续本章的学习. 二.内容 .add 将元素添加到匹配元素的集合中 .add(object) .add(selector,context) .addSelf ...
- Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)
关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...