bzoj 4358: permu 莫队
第一步先莫队分块。
对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原。
具体来说是维护两个数组now1和now2,一个向右最长的长度,一个向左的长度,每插入一个值x,用x+1的now2更新x的now2,用x-1的now1更新x的now1,now1[x]+now2[x]-1可能为最终答案,再把x所在的最长区间的左右端点的now数组更新,中间的值不需要更新,因为不可能再往中间插入数了。
有生以来第一次bzoj榜一。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 50005
#define d 223
using namespace std;
int n,m;
int c[N];
int ans[N];
struct node
{
int l,r,id,yuan;
friend bool operator < (node aa,node bb)
{
if(aa.id!=bb.id)return aa.id<bb.id;
return aa.r<bb.r;
}
}a[N];
int now1[N],now2[N];
int st1[N*],st2[N*],top;
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].yuan=i;a[i].id=(a[i].l-)/d+;
}
sort(a+,a+m+);
int as=;int r=,t=;
for(int i=;i<=m;i++)
{
if(a[i].id!=a[i-].id)
{
as=;
memset(now1,,sizeof(now1));
memset(now2,,sizeof(now2));
r=t=a[i].id*d;
}
while(a[i].r>r)
{
r++;
now1[c[r]]=now1[c[r]+]+;
now2[c[r]]=now2[c[r]-]+;
int tt=now1[c[r]]+now2[c[r]]-;
now2[c[r]+now1[c[r]]-]=tt;
now1[c[r]-now2[c[r]]+]=tt;
as=max(as,tt);
}
int tmp=as;top=;
for(int j=a[i].l;j<=min(a[i].r,t);j++)
{
now1[c[j]]=now1[c[j]+]+;
now2[c[j]]=now2[c[j]-]+;
int tt=now1[c[j]]+now2[c[j]]-;
int rr=c[j]+now1[c[j]]-;int ll=c[j]-now2[c[j]]+;
st1[++top]=rr;st2[top]=now2[rr];
st1[++top]=ll;st2[top]=now1[ll];
now2[rr]=tt;
now1[ll]=tt;
tmp=max(tmp,tt);
}
for(int j=top;j>=;j--)
{
if(j%==)now1[st1[j]]=st2[j];
else now2[st1[j]]=st2[j];
}
for(int j=a[i].l;j<=min(a[i].r,t);j++)
{
now1[c[j]]=now2[c[j]]=;
}
ans[a[i].yuan]=tmp;
}
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
return ;
}
bzoj 4358: permu 莫队的更多相关文章
- bzoj 4358 Permu - 莫队算法 - 链表
题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...
- 【BZOJ】4358: permu 莫队算法
[题意]给定长度为n的排列,m次询问区间[L,R]的最长连续值域.n<=50000. [算法]莫队算法 [题解]考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[ ...
- BZOJ 4358 坑 莫队+线段树 死T
这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...
- [BZOJ 3236] [Ahoi2013] 作业 && [BZOJ 3809] 【莫队(+分块)】
题目链接: BZOJ - 3236 BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删 ...
- bzoj 4358 permu
比较容易想到莫队算法+线段树,但是这样时间复杂度是O(nsqrtnlogn)无法通过,考虑如果不进行删除操作,只有添加操作的话那么并查集就可以实现了,于是可以设定sqrtn块,每个块范围为(i-1)* ...
- Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 833 Solved: 397[Submit][Status][D ...
- bzoj 3757 树上莫队
感谢以下文章作者: http://blog.csdn.net/kuribohg/article/details/41458639 http://vfleaking.blog.163.com/blog/ ...
- BZOJ - 3757 树上莫队解决离线路径问题 & 学习心得
题意:给你一棵树,求u,v最短路径的XXX(本题是统计权值种类) 今天课上摸鱼学了一种有意思的处理路径方式(其实是链式块状树翻车了看别的),据说实际运行跑的比XX记者还快 大概就是像序列莫队那样 首先 ...
- BZOJ 3757 苹果树 ——莫队算法
挺好的一道题目,怎么就没有版权了呢?大数据拍过了,精神AC.... 发现几种颜色这性质比较垃圾,不可加,莫队硬上. %了一发popoqqq大神的博客, 看了一波VFK关于糖果公园的博客, 又找了wjm ...
随机推荐
- FFT(快速傅里叶变换)算法详解
多项式的点值表示(Point Value Representation) 设多项式的系数表示(Coefficient Representation): \[ \begin{align*} \mathr ...
- 实验二 Java面向对象程序设计 20135321
课程:Java程序设计 班级:1353 姓名:余佳源 学号:20135321 成绩: 指导教师:娄嘉鹏 实验日期:2015-5-8 实验密级: ...
- VS2010中配置OpenGL
下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- 软工1816 · 作业(十二)Beta答辩总结
组长博客 宣传视频 github团队项目仓库 本组成员 队员姓名与学号 124 王彬(组长) 206 赵畅 215 胡展瑞 320 李恒达 131 佘岳昕 431 王源 206 陈文垚 209 陈志炜 ...
- Leetcode题库——6.Z字形变换
@author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...
- 利用python进行简单的图像处理:包括打开,显示以及保存图像
利用python进行简单的图像处理:包括打开,显示以及保存图像 利用PIL处理 PIL(python image library) 是python用于图片处理的package.但目前这个package ...
- C#简单窗体应用程序(二)
使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计登录界面,效果如下: 第一步:创建项目: 文 ...
- form表单转化json对象
利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; ...
- OpenGL三维与光照
#include<windows.h> #include<gl/glut.h> #include<gl/gl.h> #include<gl/glu.h> ...
- Vue.js——60分钟browserify项目模板快速入门
概述 在之前的一系列vue.js文章,我们都是用传统模式引用vue.js以及其他的js文件的,这在开发时会产生一些问题. 首先,这限定了我们的开发模式是基于页面的,而不是基于组件的,组件的所有代码都直 ...