[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 ...
随机推荐
- 四十三:数据库之SQLAlchemy之group_by和having子句
group_by:根据某个字段进行分组,比如想要根据年龄进行分组,再统计每一组有多少人having:对查找结果进一步过滤,类似于SQL语句的where 准备工作 from sqlalchemy imp ...
- Jenkins持续集成环境部署
一.下载Jenkins Jenkins下载地址:https://jenkins.io/download/ 这里我们下载的是jenkins.war 二.启动Jenkins 在Linux下启动Jenkin ...
- Delphi导出Excel的设置操作
procedure CreatRepSheet(SheetName:String;PageSize,PageLay:Integer); {新建Excel工作簿.进行页面设置} begin {新建Exc ...
- HiMall 3接口鉴权参考
签名算法 为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,HOP服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝.TOP目前支持的签名算法只有一种:MD5(s ...
- jeecg bpm流程节点流程节点配置
流程节点 流程节点 cgFormBuildController.do?ftlForm&tableName=jform_leave&mode=onbutton&ftlVersio ...
- Python学习之数据库
9.6 表的查询 [结构]select distinct 字段1,字段2 from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit 限制条数 [ ...
- vue-cli3.0使用及部分配置详解
1.检测安装 vue-V 2.创建项目命令:(官网) 3.简单的配置信息 这里如果你是第一次用3.0版本的话,是没有前两个的,而只有最后两个,这里是 让你选的,第一个是默认配置,一般选第二个,自己 ...
- 二、Kubernetes_V1.10集群部署-master-etcd
1.ETCD集群服务器: (1)172.18.6.39 (2)172.18.6.40 (3)172.18.6.41 1.安装etcd # yum -y install etcd 2.发布证书 cp - ...
- 面试官:new一个对象有哪两个过程?
Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...
- REST风格,@PathVariable注解
REST(Representational State Transfer,表述性状态转移)是一种软件风格.所谓的REST风格可以简单理解为:使用url表示资源时,每个资源都用一个独一无二的url来表示 ...