这道题是几天前水过去的,现在快没印象了,水一发。

首先我们看到它让求解的是最长的值域 连续段长度,很好。

然后就想到了山海经,但但是我还没有做。

然后又想到了很久以前的一次考试的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:莫队+线段树/回滚莫队的更多相关文章

  1. [BZOJ4358]Permu(回滚莫队)

    [BZOJ4358]Permu(回滚莫队) 题面 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域连续段长度. 分析 最简单的方法显然是用线段 ...

  2. [CSP-S模拟测试]:ants(回滚莫队)

    题目描述 然而贪玩的$dirty$又开始了他的第三个游戏. $dirty$抓来了$n$只蚂蚁,并且赋予每只蚂蚁不同的编号,编号从$1$到$n$.最开始,它们按某个顺序排成一列.现在$dirty$想要进 ...

  3. 「JOISC 2014 Day1」历史研究 --- 回滚莫队

    题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...

  4. 洛谷 P6072 -『MdOI R1』Path(回滚莫队+01-trie)

    题面传送门 又是 ix35 神仙出的题,先以 mol 为敬 %%% 首先预处理出根节点到每个点路径上权值的异或和 \(dis_i\),那么两点 \(a,b\) 路径上权值的异或和显然为 \(dis_a ...

  5. LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)

    LOJ 莫队.发现只需要维护前驱后继就可以了. 但是加入一个点需要找到它当前的前驱后继,很麻烦还带个\(\log\). 但是如果只有删除某个点,只需要更新一下它的前驱后继即可. 用回滚莫队就好惹. 撤 ...

  6. Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树

    E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...

  7. BZOJ.4241.历史研究(回滚莫队 分块)

    题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...

  8. 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线

    正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...

  9. 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)

    传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...

随机推荐

  1. Cinder 架构分析、高可用部署与核心功能解析

    目录 文章目录 目录 Cinder Cinder 的软件架构 cinder-api cinder-scheduler cinder-volume Driver 框架 Plugin 框架 cinder- ...

  2. 阶段3 2.Spring_10.Spring中事务控制_11 spring5新特性的介绍

    jdk1.7和1.8的差别 准备好的一个maven工程 反射创建对象10亿次 ,用的时间 替换jdk的版本 选择为1.7 切换了1.7的版本以后呢执行的速度就变的非常的慢 两个版本的对比 响应式编程风 ...

  3. C#客户端填充外部IE浏览器中网页文本(input)且不提交

    //引用COM组件//Microsoft HTML Object Library//Microsoft Internet Controls  记得改成x86 SHDocVw.ShellWindows ...

  4. 借助marquee实现弹幕效果

    HTML标签marquee实现滚动效果 .基于此,实现简易版 弹幕:  HTML <div class="right_liuyan"> <marquee id=& ...

  5. P1706 【全排列问题】

    超级无敌大题面~~ 这题倒也花了我不少时间,不停想节省空间,但这也确实是最省的了... 主要思路呢,要注意标记数有没有选过,并标记每个数的输出顺序.. 具体注释见代码: #include<cst ...

  6. 深度学习入门者的Python快速教程 - 基础篇

      5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...

  7. linux 磁盘命令

    用到共享软件为:samba 配置文件为  /etc/samba/smb.conf sudo fdisk -l 查看磁盘 sudo df -lh 查看磁盘挂载情况 sudo mount /dev/sdb ...

  8. JavaScript Array Reduce用于数组求和

    需求一 假设有一个数组,需要对其中的元素进行求和. const numbers = [1, -1, 2, 3]; 传统写法,使用for循环求和 const numbers = [1, -1, 2, 3 ...

  9. 向tabcontrol中添加form

    昨天花了一天的时间去找一个错误,关系是这样的,我添加一个tabcontrol就叫tc1好了,然后在tc1中再动态添加一个父窗体l叫form1,要把form1添加进tabcontrol就要先新建一个ta ...

  10. python 并发编程 协程 gevent模块

    一 gevent模块 gevent应用场景: 单线程下,多个任务,io密集型程序 安装 pip3 install gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步 ...