【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每天早上都要耗费很久从一堆五颜六色 ...
随机推荐
- Maya脚本——重命名物体的名称
该脚本用于将图1中的命名变更为图2中的,把maya中使用相同名称的物体都重命名为不同的名称. 重命名的规则是:组名_原名称_序号 查阅了maya的官方手册:http://download.autode ...
- BIND的安装配置
简介 bind是dns协议的一种实现,也就是说,bind仅仅是实现DNS协议的一种应用程序 bind运行后的进程名叫named,不叫bind bind bind的配置文件在:/etc/named.co ...
- Markdown使用github风格时报TLS错误解决办法
https://docs.microsoft.com/en-us/officeonlineserver/enable-tls-1-1-and-tls-1-2-support-in-office-onl ...
- huawei oceanstor
华为产品:OceanStor 6000 V3系列 OceanStor 6800 V3 网页登入设备页面:https+ip+端口 资源分配界面: 首页: wwn为2100xxxxxxxx47e4,设 ...
- udp 局域网群聊
UDP: 无连接协议 udp协议发送数据,用的是数据报包的形式.(64KB以内) 发送端: 1.定义发送的datagramsocket对象,发送端可以不用定义端口 2.定义封装数据包datag ...
- pyspark在windows中的安装
0.安装python,我用的是python2.7.13 1.安装jdk 一定要安装1.7以上的版本,安装低版本会报下面的错误 java.lang.NoclassDefFoundError 安装后不用手 ...
- IPv4编址及子网划分
在讨论IP编址之前,我们需要讨论一下主机与路由器连入网络的方法.一台主机通常只有一条链路链接到网络:当主机中的IP想发送一个数据报时,它就在链路上发送,主机与物理链路之间的边界叫做接口(interfa ...
- 我的bootstrap学习
前端开发框架bootstrap Bootstrap 安装 <link ref="stylesheet" href="bs/css/bootstrap.css ...
- 解题:POI 2007 Weights
题面 这是个$O(nlog^2$ $n)$的解法,因为蒟蒻博主没有看懂$O(nlog$ $n)$的更优秀的解法 显然从小到大装砝码是最优的方法,又显然从大到小装容器不会使得答案变劣,还显然砝码数具有单 ...
- 【agc003E】Sequential operations on Sequence
Portal -->agc003E Description 给你一个数串\(S\),一开始的时候\(S=\{1,2,3,...,n\}\),现在要对其进行\(m\)次操作,每次操作给定一个\(a ...