先放代码 晚上补(争取)


[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. WPF中动画教程(DoubleAnimation的基本使用)

    实现效果 今天以一个交互式小球的例子跟大家分享一下wpf动画中DoubleAnimation的基本使用.该小球会移动到我们鼠标左键或右键点击的地方. 该示例的实现效果如下所示: 页面设计 xaml如下 ...

  2. DNS的各种记录类型的应用解析

    可能很多人平时工作中不会遇到DNS配置相关的问题, 但如果偶尔遇到不同类型DNS记录的配置, 在没有搞清楚它们都是干啥的情况下, 会眼花缭乱, 还记得很多年前实验室配置DNS不太对导致只能访问www. ...

  3. #树状数组,CDQ分治#洛谷 4390 [BOI2007]Mokia 摩基亚

    题目 分析 考虑离线处理,那么询问区间和就可以转换为四个询问, CDQ分治按横坐标处理询问,树状数组维护前缀和就可以了 代码 #include <cstdio> #include < ...

  4. #斐波那契#洛谷 3424 [POI2005] SUM-Fibonacci Sums

    题目 已知\(x,y\)的斐波那契表示,求\(x+y\)的斐波那契表示 分析 显然得到两条性质: \(f_{i+1}=f_{i-1}+f_i\) \(2f_i=f_{i+1}+f_{i-2}\) 那么 ...

  5. Web服务器启用HTTPS的配置方法

    本文于2016年3月完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. nginx的配置方法 可以参考Jerry Qu的本博客 Nginx 配 ...

  6. 算法小白刷了一周 LeetCode 后的思考

    Hi,我是 itchao 我自己工作有 2 两年多的前端开发经验,但是数据结构与算法一直不好,基本就是一个算法小白的水平. 听说大公司面试都要手写算法题,最近为了以后能去更好的公司,然后其实心里比较着 ...

  7. TextIn.com API使用心得

    我们参加了本次大学生创新创业服务外包大赛,在项目中大量使用到了合合信息所提供的api进行相关功能实现,所以在这里写一篇博客分享一下我们在项目的实际推进中关于TextIn.com API使用心得 我们的 ...

  8. 树模型-CART树

    分类回归树CART CART树是后面所有模型的基础,也是核心树 在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择.在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特 ...

  9. js 使用flow

    前言 what is flow?我想是的,很多人都没有接触过,的确,他是一个新的项目,是的facebook开发的东西,一般还是可以的,有必要去学习一下,在react还是比较重要的. 它做的一件事叫做静 ...

  10. Node中的EventEmitter? 如何实现一个EventEmitter?

    一.是什么 我们了解到,Node采用了事件驱动机制,而EventEmitter就是Node实现事件驱动的基础 在EventEmitter的基础上,Node几乎所有的模块都继承了这个类,这些模块拥有了自 ...