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

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

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

然后又想到了很久以前的一次考试的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. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_01.SpringMVC概述及入门案例

    第二章 第三章 第四章 三层框架 springMvc是表现层

  2. 二十:jinja2之加载静态文件

    静态文件: flask默认指定的静态文件路径为根目录下的static,可以自定义路径,并指定,使用url_for('文件夹', filename='文件名')引用 加载css文件 加载js文件 其他文 ...

  3. ALV SCRIPTFROM 内容比较全的一个例子

    REPORT  ZQM_PRT04. *----------------------------------------------------------------------* * TABLES ...

  4. 将训练好的tensorflow模型移植到android应用中

    具体步骤如下: 1.  TFLiteConverter保存模型 修改网络模型代码,将模型通过TFLiteConverter转化成为 TensorFlow Lite FlatBuffer即为.tflit ...

  5. C#打开文件

    C#中经常用到的功能,打开文件: /// <summary> /// 打开文件,可选择多个文件 /// </summary> /// <param name=" ...

  6. Linux进程的虚拟内存

    简介 用户进程的虚拟地址空间是Linux的一个重要的抽象:它为每个运行进程提供了同样的系统视图,这使得多个进程可以同时运行,而不会干扰到其他进程内存中的内容. 每个应用程序都有自己的线性地址空间,与所 ...

  7. JS点击img图片放大再次点击缩小JS实现 简单实用Ctrl+C+V就可以用

    业务需要,从后台获取的图片列表,用img标签展示,用户需要查看大图.记录下来以便学习和参考.示例图如下: 放大之前: 放大之后: 点击后放大(由于图片高度超出了页面,需要通过overflow:auto ...

  8. 应用安全 - 工具 | 平台 -webmin - 漏洞 - 汇总

    简介 开发语言 PHP 用途系统管理 CVE-2019-15642 Date2019.7 类型远程代码执行 影响范围Webmin <= 1.920 复现POC|EXPOBJECT Socket; ...

  9. python 进程和串行(——)

    进程 1.什么是串行? 串行:就是一个程序完完整整的运行完了,下个程序才运行. 2.什么是进程? 进程:一个正在运行的程序或一个程序运行的过程. 为什么要用进程. 提高程序执行效率. 多道技术:并发技 ...

  10. noip2013day2-华容道

    题目描述 小 \(B\) 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用 编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多 少时间. 小 \(B ...