先放代码 晚上补(争取)


[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. Visual Studio 2022的安装 - 编程手把手系列文章

    工欲善其事,必先利其器. 今天讲的是编程开发工具Visual Studio 2022的安装.作为手把手系列的开始,需要先对进行编程所使用的工具进行了解.此博文从下面几个步骤入手,对VS 2022这个开 ...

  2. #2-SAT,平面图#洛谷 3209 [HNOI2010] 平面图判定

    题目传送门 分析 首先一张图是平面图的必要条件为 \(m\leq 3*n-6\), 然后考虑到这题的图存在哈密尔顿回路,也就是说非环边因为跨立形成奇环即为无解 那么直接拆点跑2-SAT就可以了 代码 ...

  3. #主席树,fread,fwrite#洛谷 1972 [SDOI2009]HH的项链

    题目 分析 维护每个位置的后继,问题转换为后继在区间外的位置的个数, 但是这题太卡常了,所以我就加了fread和fwrite 其实树状数组的解法我也写过了 代码 #include <cstdio ...

  4. OpenHarmony系统使用gdb调试init

      前言 OpenAtom OpenHarmony(简称"OpenHarmony")适配新的开发板时,启动流程init大概率会出现问题,其为内核直接拉起的第一个用户态进程,问题定位 ...

  5. 全面的开发者文档和用户目标解析:API 文档指南和开发者旅程

    开发者文档 开发者文档,也称为 API 文档,是一种专门针对软件开发人员的技术写作形式.这种类型的文档通常包括 API 的技术规范.代码注释.软件设计和架构以及软件开发中涉及的其他详细技术描述.开发者 ...

  6. Docker学习路线5:在 Docker 中实现数据持久化

    Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离.默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失.为了解决这个问题并在容器生命周期内保留数据,Doc ...

  7. 单链表实现增删查改等操作(python版本)

    单向链表 : SingleLinkedList 节点类属性: 数据域:value 节点存储的数据 地址域:next 指向下一个节点的地址 链表类属性: 头指针:head 指向链表的第一个节点的地址 尾 ...

  8. NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

    NL2SQL进阶系列(1):DB-GPT-Hub.SQLcoder.Text2SQL开源应用实践详解 NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BI ...

  9. caidao qsnctfwp

    进入网页发现如下内容 直接使用蚁剑连接 连接并进入后,在根目录下发现名为 flag 的文件,即可获取 flag -End-

  10. MySQL组合索引

    MySQL组引合索优化SQL 我的场景 200w左右的数据,后面会更多 使用定时任务爬取数据插入到自己的数据库.要保证数据的唯一性,所以我用了组合唯一索引. 表结构 最初的组合索引 SQL执行和exp ...