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

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

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

然后又想到了很久以前的一次考试的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. 关于Toad的Cannot load OCI DLL问题

    昨天重新安装了新版本的JDK,突然发现Toad连接的时候报Cannot load OCI DLL....问题,网上查找了多种方法均不见效. 后调整系统环境变量配置,还原了之前安装的JDK版本,问题修复 ...

  2. hash模块MD5加密

    MD5加密:获取32位加密字符串: 示例(MD5加密'123456')import hashlibhashObject=hashlib.md5(b'123456') #实例化,加密字符串不能直接加密, ...

  3. opencv2中访问像素的简单方法-自定义一个宏CV_MAT_ELEM2

    利用Mat的step[0],step[1]访问像素的行列,自定义一个宏CV_MAT_ELEM2(src,dtype,y,x),src是待访问的Mat,dtype是src的数据类型(int,float, ...

  4. 学习Go语言(一)环境安装及HelloWorld

    自己开发的时候,一般用Java和C#居多,偶尔也用Python做点东东. 想体验一下比较“现代”语言,思来想去就来体验一下Go语言. 闲话少叙,言归正传,首先就是环境安装,这个轻车熟路: (1)到官网 ...

  5. 关于Qt中的QMutex——关于lock与unlock

    大概说一下用法,例子: QMutex mutex; int number = 6; void method1() { mutex.lock(); number *= 5; number /= 4; m ...

  6. AndroidStudio ADB WIFI :adb wifi scan ip address

    笔记本使用Android studio的adb wifi插件时,AS 最下方报 adb wifi scan ip address.一直无法使用. 解决办法: ----在Terminal窗口中输入: a ...

  7. 【Linux 网络编程】OSI七层模型

    OSI(Open System Interconnection)开放系统互联模型(1)应用层: 应用层与应用程序界面沟通,以达到展示给用户的目的.(2)表示层: 表示层对网络传输的数据进行交换,使得多 ...

  8. springboot笔记-文件上传

    使用 Spring Boot 和 Thymeleaf 上传文件 Spring Boot 利用 MultipartFile 的特性来接收和处理上传的文件,本示例前端页面使用 Thymeleaf 来处理. ...

  9. python 链接mysql

    下载对应版本   安装 https://dev.mysql.com/downloads/connector/python/ 创建链接 # python 链接mysqlimport mysql.conn ...

  10. D - 卿学姐与魔法

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...