先放代码 晚上补(争取)


[BZOJ4358]permu 线段树+莫队做法

序列操作,多次询问,无修,标准的莫队。

在如何在不同区间内转移的问题上,我选择用线段树来维护(没听xfg讲回滚莫队不行啊)

其中,\(lm\)为一段序列左边界开始最长值域连续段,\(rm\)为右边界开始的,\(mm\)为整个区间中最长值域连续段。

类似于山 海 经,\(pushup\)更新时,左仍为左,右仍为右;当左子区间的\(lm==len\),也就是左子区间全部连续时,这时原区间的\(lm=\)左子区间全部\(+\)右子区间的\(lm\);右边同理。

对于\(mm\),来源是左右子区间的\(mm\)和左子区间的\(rm\)与右子区间的\(lm\)的和的最大值。

因为我们开的是线段树,所以可以保证区间的连续性。

然后按上莫队板子就结束啦。

code:

#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
typedef long long ll;
using namespace std;
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
const int Ratio=0;
const int N=100005;
const int maxi=INT_MAX;
int n,m;
int sq,c[N],bl[N],ans[N],sj[N];
struct rmm
{
int l,r,id;
}q[N];
bool cmp(rmm a,rmm b)
{
if(bl[a.l]!=bl[b.l])
return bl[a.l]<bl[b.l];
if(bl[a.l]&1)
return a.r<b.r;
return a.r>b.r;
}
struct rmmm
{
int len,lm,rm,mm;
}t[N<<2];
namespace Acheron
{
#define lid (rt<<1)
#define rid (rt<<1|1)
void Apushup(int rt)
{
t[rt].lm=t[lid].lm;
t[rt].rm=t[rid].rm;
if(t[lid].lm==t[lid].len)
t[rt].lm+=t[rid].lm;
if(t[rid].rm==t[rid].len)
t[rt].rm+=t[lid].rm;
t[rt].mm=max({t[lid].mm,t[rid].mm,t[lid].rm+t[rid].lm});
}
void Abuild(int rt,int l,int r)
{
if(l==r)
{
t[rt].len=1;
return;
}
int mid=(l+r)>>1;
Abuild(lid,l,mid);
Abuild(rid,mid+1,r);
t[rt].len=t[lid].len+t[rid].len;
return;
}
void Aadd(int rt,int l,int r,int x)
{
if(l==x&&r==x)
{
t[rt].lm=t[rt].rm=t[rt].mm=1;
return;
}
int mid=(l+r)>>1;
if(x<=mid)
Aadd(lid,l,mid,x);
else
Aadd(rid,mid+1,r,x);
Apushup(rt);
return;
}
void Adel(int rt,int l,int r,int x)
{
if(l==x&&r==x)
{
t[rt].lm=t[rt].rm=t[rt].mm=0;
return;
}
int mid=(l+r)>>1;
if(x<=mid)
Adel(lid,l,mid,x);
else
Adel(rid,mid+1,r,x);
Apushup(rt);
return;
}
}
int main()
{
n=qr,m=qr;
sq=sqrt(n);
fo(i,1,n)
c[i]=qr,bl[i]=(i-1)/sq+1;
Acheron::Abuild(1,1,n);
fo(i,1,m)
q[i].l=qr,q[i].r=qr,q[i].id=i;
sort(q+1,q+1+m,cmp);
// Acheron::Abuild(1,1,n);
fo(i,q[1].l,q[1].r)
{
sj[c[i]]++;
Acheron::Aadd(1,1,n,c[i]);
}
ans[q[1].id]=t[1].mm;
int ls=q[1].l,rs=q[1].r;
fo(i,2,m)
{
while(ls>q[i].l)
{
ls--,sj[c[ls]]++;
if(sj[c[ls]]==1)
Acheron::Aadd(1,1,n,c[ls]);
}
while(ls<q[i].l)
{
sj[c[ls]]--;
if(sj[c[ls]]==0)
Acheron::Adel(1,1,n,c[ls]);
ls++;
}
while(rs<q[i].r)
{
rs++,sj[c[rs]]++;
if(sj[c[rs]]==1)
Acheron::Aadd(1,1,n,c[rs]);
}
while(rs>q[i].r)
{
sj[c[rs]]--;
if(sj[c[rs]]==0)
Acheron::Adel(1,1,n,c[rs]);
rs--;
}
ans[q[i].id]=t[1].mm;
}
fo(i,1,m)
printf("%d\n",ans[i]);
return Ratio;
}
苍龙濯世


Updated On 4.23 更新了做法名称。

[BZOJ4358]permu线段树+莫队的更多相关文章

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

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

  2. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

  3. 洛谷P3567 KUR-Couriers [POI2014] 主席树/莫队

    正解:主席树/莫队 解题报告: 传送门! 这题好像就是个主席树板子题的样子,,,? 毕竟,主席树的最基本的功能就是,维护一段区间内某个数字的个数 但是毕竟是刚get到主席树,然后之前做的一直是第k大, ...

  4. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  5. [BZOJ3236][AHOI2013]作业:树套树/莫队+分块

    分析 第一问随便搞,直接说第二问. 令原数列为\(seq\),\(pre_i\)为\(seq_i\)这个值上一个出现的位置,于是可以简化询问条件为: \(l \leq i \leq r\) \(a \ ...

  6. P3180-[HAOI2016]地图【圆方树,莫队,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 \(n\)个点\(m\)条边的一个仙人掌,有点权. \(Q\)次询问给出\(op,x,y\),封 ...

  7. 「题解」:[BZOJ4358]permu

    问题: permu 时间限制: 30 Sec  内存限制: 512 MB 题面 题目描述 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域 连 ...

  8. 【SDOI2009】HH的项链 (莫队)

    题面 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的 ...

  9. HDU - 2665 Kth number 主席树/可持久化权值线段树

    题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...

  10. Tree and Queries CodeForces - 375D 树上莫队

    http://codeforces.com/problemset/problem/375/D 树莫队就是把树用dfs序变成线性的数组. (原数组要根据dfs的顺序来变化) 然后和莫队一样的区间询问. ...

随机推荐

  1. 基于energy score的out-of-distribution数据检测,LeCun都说好 | NerulPS 2020

     论文提出用于out-of-distributions输入检测的energy-based方案,通过非概率的energy score区分in-distribution数据和out-of-distribu ...

  2. 详解SSL证书系列(9)SSL客户端认证

    上一篇介绍了HTTPS和HTTP协议的区别,理解了HTTP加上加密处理和认证以及完整性保护后即是HTTPS,同时HTTPS也是身披SSL外壳的HTTP,那么SSL客户端认证是怎么回事呢?这篇文章我将带 ...

  3. #矩阵树定理,高斯消元#洛谷 4111 [HEOI2015]小 Z 的房间

    题目 分析 题目要求生成树个数,求出基尔霍夫矩阵后高斯消元, 但是这里模数不是质数,所以要辗转相除法 代码 #include <cstdio> #include <cctype> ...

  4. OpenHarmony技术日探讨教育发展,聚焦开源人才培养

    4 月 25 日,OpenAtom OpenHarmony (以下简称"OpenHarmony")技术日在深圳成功举办.作为 OpenHarmony 开源项目的年度盛会,大会以&q ...

  5. 1开幕在即 | “万物互联,使能千行百业”2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛

    7月27日下午,聚焦开源产业与生态的2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛将在北京亦创国际会展中心盛大开幕. 作为OpenHarmony工作委员会联合生态合作伙伴为 ...

  6. 【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

    一. 问题描述 当用户通过缩放手势.平移手势.倾斜手势和旋转手势与地图交互,控制地图移动改变其可见区域时,华为地图SDK没有提供直接获取用户手势类型的API. 二. 解决方案 华为地图SDK的地图相机 ...

  7. 实现JWT鉴权机制

    一.是什么 JWT(JSON Web Token),本质就是一个字符串书写规范,如下图,作用是用来在用户和服务器之间传递安全可靠的信息 在目前前后端分离的开发过程中,使用token鉴权机制用于身份验证 ...

  8. ABP -Vnext框架一步一步入门落地教程——使用ABP -Vnext创建一个WEBAPI接口(二)

    开发主题:何谓开发应用服务端 在官方开发教程这一段的内容叫做开发应用服务端,作为现在前后端分离的开发模式来说,一个应用就分为前端页面框架和后端API,页面框架调用WEBAPI实现业务就完事了.所以咱们 ...

  9. easyx的使用 鼠标交互(3.1)

    本文学习于B站,进行借鉴学习记录: 视频链接:鼠标操作(新版)_哔哩哔哩_bilibili 初始化调用文件头不再使用#include<graphics.h>,选择调用#include< ...

  10. 谈谈PolarDB-X在读写分离场景的实践

    简介: 针对写少读多的业务可以考虑通过添加数据库节点来使其达到提升性能的目的,但添加节点,往往涉及到数据的搬迁,扩容周期比较长,很难应对徒增的业务流量,这个时候可以考虑采用读写分离的方式,将读写流量做 ...