[BZOJ4358]permu线段树+莫队
先放代码 晚上补(争取)
[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线段树+莫队的更多相关文章
- [BZOJ4358]Permu(回滚莫队)
[BZOJ4358]Permu(回滚莫队) 题面 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域连续段长度. 分析 最简单的方法显然是用线段 ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- 洛谷P3567 KUR-Couriers [POI2014] 主席树/莫队
正解:主席树/莫队 解题报告: 传送门! 这题好像就是个主席树板子题的样子,,,? 毕竟,主席树的最基本的功能就是,维护一段区间内某个数字的个数 但是毕竟是刚get到主席树,然后之前做的一直是第k大, ...
- 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
[题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...
- [BZOJ3236][AHOI2013]作业:树套树/莫队+分块
分析 第一问随便搞,直接说第二问. 令原数列为\(seq\),\(pre_i\)为\(seq_i\)这个值上一个出现的位置,于是可以简化询问条件为: \(l \leq i \leq r\) \(a \ ...
- P3180-[HAOI2016]地图【圆方树,莫队,分块】
正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 \(n\)个点\(m\)条边的一个仙人掌,有点权. \(Q\)次询问给出\(op,x,y\),封 ...
- 「题解」:[BZOJ4358]permu
问题: permu 时间限制: 30 Sec 内存限制: 512 MB 题面 题目描述 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域 连 ...
- 【SDOI2009】HH的项链 (莫队)
题面 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的 ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
- Tree and Queries CodeForces - 375D 树上莫队
http://codeforces.com/problemset/problem/375/D 树莫队就是把树用dfs序变成线性的数组. (原数组要根据dfs的顺序来变化) 然后和莫队一样的区间询问. ...
随机推荐
- 7 JavaScript循环语句
7 循环语句 在js中有三种循环语句. 首先是while循环. 它的逻辑和咱们python中的while几乎一模一样, 就是符号上有些许的区别. // 语法 while(条件){ 循环体 -> ...
- #AC自动机,树状数组#洛谷 2414 [NOI2011] 阿狸的打字机
题目 分析 首先考虑按照题意建出一个AC自动机, 然后\(s[x]\)在\(s[y]\)出现的次数也就是 在fail树上,根节点到\(y\)中一共出现了多少个\(x\), 在\(x\)的终止节点处统计 ...
- OpenHarmony社区运营报告(2022年12月)
本月快讯 • 本月新增22款产品通过兼容性测评,累计220款产品通过兼容性测评. • 12月28日,OpenAtom OpenHarmony(以下简称"OpenHarmony")凭 ...
- HarmonyOS数据管理与应用数据持久化(二)
通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据,当需要存储的数据没有复杂的关系模型,比如存储商品名称及对应价格.员工工号及今日是否已出勤等,由于数据复杂度低,更容易兼容不同 ...
- Causal Inference理论学习篇-Tree Based-Causal Tree
Tree-Based Algorithms Tree-based这类方法,和之前meta-learning 类的方法最明显的区别是: 这类方法把causal effect 的计算显示的加入了到了树模型 ...
- 重新整理linux 系列 ——硬件的介绍(一)
前言 打算重新整理linux,计划每天一更,希望能够按照计划执行吧. 正文 首先有一个疑惑,那就是一台手机是否是一台计算机? 来看下什么可以定义为一台计算机: 计算机为接收用户的输入,经由中央处理器的 ...
- 第五章-for循环的练习
/* * @Issue: 每个苹果0.8元,第一天买两个苹果,从第二天开始,每天买前一天的两倍,直至购买的苹果数量 * 个数达到不超过100的最大值,编写程序求每天平均花多少钱. * @Author: ...
- 实训篇-Css-跳动的红心
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Redis 性能优化实战
Redis 作为内存数据库,其性能表现非常出色,单机 OPS 很容易达到 10万以上,这主要得益于其高效的内存数据结构.单线程无锁设计.IO 多路复用等技术实现.但是在线上生产环境的使用中,我们仍然会 ...
- 如何实现数据库数据到Abp vnext实体对象的同步?以及代码生成工具
在采用了EF Core的Code First方式下,如果你在数据库中直接添加了新表或存储过程,你需要在项目代码中手动反向工程这些数据库的更改,以保持Code First的代码与数据库同步.这种情况可以 ...