[bzoj4358]permu:莫队+线段树/回滚莫队
这道题是几天前水过去的,现在快没印象了,水一发。
首先我们看到它让求解的是最长的值域 连续段长度,很好。
然后就想到了山海经,但但是我还没有做。
然后又想到了很久以前的一次考试的T3旅馆hotel(我是用暴力直接过的QAQ),正解也是线段树。
但是我还是想不到用线段树,因为我单纯的认为当前在学莫队就只会用到莫队。
后来还是问了同学。
然后就很简单了。
我们考虑询问区间的这类操作。
一种做法是各种神仙树套树解决区间问题。
另一种骗分做法就是莫队了。
不会莫队。。出门左拐(逃
那么这道题思路就可以出来了:莫队操作,每次在值域线段树这个位置的数上位置插入“1”,删除减少“1”即可,然后直接答案就是[1,n]的最长连续段长。
如果你做过类似的线段树的题,这种东西就很简单了喂。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e4+;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>'') f=(ch=='-')?-:,ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
} int n,m,blo;
int col[N],bel[N],ans[N];
struct node{
int l,r,ord;
inline friend bool operator<(node a,node b){
return (bel[a.l] ^ bel[b.l]) ? bel[a.l] < bel[b.l] : ((bel[a.l] & ) ? a.r < b.r : a.r > b.r);
}
}q[N];
struct Seg_Tree{
#define lch k<<1
#define rch k<<1|1
struct Node{
int lmax,rmax,mmax;
int len;
}tr[N<<];
inline void Build(int k,int l,int r){
tr[k].len=r-l+;
if(l==r) return;
int mid=(l+r)>>;
Build(lch,l,mid);Build(rch,mid+,r);
}
inline void up(int k){
tr[k].lmax=tr[lch].lmax;
tr[k].rmax=tr[rch].rmax;
if(tr[lch].lmax==tr[lch].len) tr[k].lmax+=tr[rch].lmax;
if(tr[rch].rmax==tr[rch].len) tr[k].rmax+=tr[lch].rmax;
tr[k].mmax=max(max(tr[lch].mmax,tr[rch].mmax),tr[lch].rmax+tr[rch].lmax);
}
inline void Insert(int k,int l,int r,int x){
if(l==x&&r==x){
tr[k].lmax=;tr[k].rmax=;tr[k].mmax=;
return;
}
int mid=(l+r)>>;
if(x<=mid)Insert(lch,l,mid,x);
else Insert(rch,mid+,r,x);
up(k);
}
inline void Erase(int k,int l,int r,int x){
if(l==x&&r==x){
tr[k].lmax=;tr[k].rmax=;tr[k].mmax=;
return;
}
int mid=(l+r)>>;
if(x<=mid)Erase(lch,l,mid,x);
else Erase(rch,mid+,r,x);
up(k);
}
}str; int main(){
n=read();
m=read();
blo=(int)sqrt(n)+;
str.Build(,,n);
for(int i=;i<=blo;++i)
for(int j=;j<=blo;++j)
{bel[(i-)*blo+j]=i;if((i-)*blo+j==n) break;}
for(int i=;i<=n;++i) col[i]=read();
for(int i=;i<=m;++i){
q[i].l=read();
q[i].r=read();
q[i].ord=i;
}
sort(q+,q+m+);
register int l=q[].l,r=q[].r;
for(int i=l;i<=r;++i) str.Insert(,,n,col[i]);
for(int i=;i<=m;++i){
while(r<q[i].r) str.Insert(,,n,col[++r]);
while(l>q[i].l) str.Insert(,,n,col[--l]);
while(l<q[i].l) str.Erase(,,n,col[l++]);
while(r>q[i].r) str.Erase(,,n,col[r--]);
ans[q[i].ord]=str.tr[].mmax;
}
for(int i=;i<=m;++i) printf("%d\n",ans[i]);
return ;
}
upd:回滚莫队真香。
[bzoj4358]permu:莫队+线段树/回滚莫队的更多相关文章
- [BZOJ4358]Permu(回滚莫队)
[BZOJ4358]Permu(回滚莫队) 题面 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域连续段长度. 分析 最简单的方法显然是用线段 ...
- [CSP-S模拟测试]:ants(回滚莫队)
题目描述 然而贪玩的$dirty$又开始了他的第三个游戏. $dirty$抓来了$n$只蚂蚁,并且赋予每只蚂蚁不同的编号,编号从$1$到$n$.最开始,它们按某个顺序排成一列.现在$dirty$想要进 ...
- 「JOISC 2014 Day1」历史研究 --- 回滚莫队
题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...
- 洛谷 P6072 -『MdOI R1』Path(回滚莫队+01-trie)
题面传送门 又是 ix35 神仙出的题,先以 mol 为敬 %%% 首先预处理出根节点到每个点路径上权值的异或和 \(dis_i\),那么两点 \(a,b\) 路径上权值的异或和显然为 \(dis_a ...
- LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)
LOJ 莫队.发现只需要维护前驱后继就可以了. 但是加入一个点需要找到它当前的前驱后继,很麻烦还带个\(\log\). 但是如果只有删除某个点,只需要更新一下它的前驱后继即可. 用回滚莫队就好惹. 撤 ...
- Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树
E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...
- BZOJ.4241.历史研究(回滚莫队 分块)
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...
- 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线
正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...
- 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)
传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...
随机推荐
- 为解决Thymeleaf数字格式化问题而想到的几种方案
背景: spring后端输出double类型数据,前端使用thymeleaf框架,格式化double数据类型,由于需要显示原值(比如原来录入5,而不能显示5.00),因此需要存储数值(存储值为deci ...
- fiddler配置会话框菜单栏
1.添加会话框菜单:鼠标移至会话框菜单的左上角“#”位置,右键>Customize column,Collection下拉菜单选择"Miscellaneous",Field ...
- win10安装mysql-最简单教程
工具下载地址 链接: https://pan.baidu.com/s/1XL2wUDrcd9NpT8NOcXoDTQ 提取码: vu34 下载好之后解压. 在目录D:\Program Files\my ...
- IOS CocoaPods详细使用方法
自从有了CocoaPods以后,这些繁杂的工作就不再需要我们亲力亲为了,只需要我们做好少量的配置工作,CocoaPods会为我们做好一切 一.什么是CocoaPods 1.为什么需要CocoaPo ...
- Linux 的简单命令以及在idea中配置码云
Linux 的简单命令: ls(list)功能:列出目录内容 cd(change directory)功能:切换目录 touch 1.txt 在当前目录创建一个文件1.txt clear:清除屏幕 p ...
- (转)GIS中的4D产品(DLG、DRG、DEM、DOM)
DLG 数字线划地图(DLG, Digital Line Graphic):是与现有线划基本一致的各地图要素的矢量 数据集,且保存各要素间的空间关系和相关的属性信息. 在世字测图中,最为常见的产品就是 ...
- canvas基础知识
canvas基础知识 ## CanvasDOM对象 #### 获取绘图环境```canvas.getContext();``` #### 设置宽和高```canvas.width = 500;canv ...
- 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式
在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...
- 详解MySql的配置文件my.cnf
1.Windows下MySQL的配置文件是my.ini,一般会在安装目录的根目录. 2.Linux下MySQL的配置文件是my.cnf,一般会放在/etc/my.cnf,/etc/mysql/my.c ...
- 初步学习jquery学习笔记(六)
jquery学习笔记六 AJAX 简介 AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. load() 方法 load() 方法从服务器加载数据,并把返回的数据 ...