「题解」:[BZOJ4358]permu
问题: permu
时间限制: 30 Sec 内存限制: 512 MB
题面
题目描述
给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问。每次询问某个区间[l,r]中,最长的值域
连续段长度。
输入格式
第一行两个整数n,m。
接下来一行n个整数,描述P。
接下来m行,每行两个整数l,r,描述一组询问。
输出格式
对于每组询问,输出一行一个整数,描述答案。
样例输入
8 3
3 1 7 2 5 8 6 4
1 4
5 8
1 7
样例输出
3
3
4
题解
线段树+莫队。
考虑维护区间连续值域长度最大值。
首先显然莫队。(毕竟是蒟蒻我在莫队专题里遇到的题目……)
序列操作、多次询问,最关键的是无修!(没学过带修莫队不行啊 /理直气壮)
于是考虑怎么在不同区间内转移。
我们先种一棵值域线段树维护点的存在与否。
我们假设li为某段区间从左边界开始的最长值域连续段,ri为从右边界开始的最长值域连续段,mi为区间中最长值域连续段,考虑如何转移。
当push_up的时候,li由左儿子的li转移而来。特殊地,我们考虑左儿子整个区间连续,则li由左儿子的区间大小加上右儿子的li转移而来。
同理,ri由右儿子的ri转移。特殊情况为右儿子的区间大小加上左儿子的ri。
考虑mi的转移。显然mi由左儿子的mi和右儿子的mi以及左儿子的ri与右儿子的li组成的新区间转移而来。
注意我们开的是值域线段树,因此可以保证区间的连续性。
于是线段树维护3个标记我们就可以方便的进行转移了。
然后就是莫队板子。不断在线段树中插入点,删除点并进行转移统计答案。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define rint register int
using namespace std;
int n,m,a[],tk[],belong[],l,r,sum_q,ans[];
struct node1{int li,ri,mi,size;}t[];
struct node2{int l,r,id;}que[];
inline bool cmp(node2 a,node2 b)
{
return (belong[a.l]^belong[b.l])?belong[a.l]<belong[b.l]:((belong[a.l]&)?a.r<b.r:a.r>b.r);
}
inline void build(rint k,rint l,rint r)
{
if(l==r){t[k].size=;return ;}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
t[k].size=t[k<<].size+t[k<<|].size;
return ;
}
inline void update(rint k)
{
t[k].li=t[k<<].li;t[k].ri=t[k<<|].ri;
if(t[k<<].li==t[k<<].size)t[k].li+=t[k<<|].li;
if(t[k<<|].ri==t[k<<|].size)t[k].ri+=t[k<<].ri;
// cout<<"left:"<<t[k<<1].mi<<" right:"<<t[k<<1|1].mi<<" mid:"<<t[k<<1].ri+t[k<<1|1].li<<endl;
t[k].mi=max(max(t[k<<].mi,t[k<<|].mi),t[k<<].ri+t[k<<|].li);
}
inline void change(rint k,rint p,rint u,rint l,rint r)
{
// cout<<"change:"<<p<<endl;
if(l==u&&r==u)
{
// cout<<p<<endl;
t[k].mi=p;t[k].li=p;t[k].ri=p;
// cout<<"mi:"<<t[k].mi<<endl;
return ;
}
rint mid=(l+r)>>;
if(u<=mid)change(k<<,p,u,l,mid);
else change(k<<|,p,u,mid+,r);
update(k);//cout<<t[k].mi<<endl;
return ;
}
int main()
{
scanf("%d %d",&n,&m);
sum_q=(int)sqrt(n);
for(rint i=;i<=n;++i)
{
scanf("%d",&a[i]);
belong[i]=i/sum_q+;
}
build(,,n);
for(rint i=;i<=m;++i)
{
scanf("%d %d",&que[i].l,&que[i].r);
que[i].id=i;
}
sort(que+,que+m+,cmp);
for(rint i=que[].l;i<=que[].r;++i)
{
tk[a[i]]++;
if(tk[a[i]]==)change(,,a[i],,n);
}
ans[que[].id]=t[].mi;
l=que[].l,r=que[].r;
for(rint i=;i<=m;++i)
{
// cout<<l<<" "<<que[i].l<<endl;
while(l<que[i].l){tk[a[l]]--;if(tk[a[l]]==)change(,,a[l],,n);l++;}
// cout<<l<<" "<<que[i].l<<endl;
while(l>que[i].l){l--;tk[a[l]]++;if(tk[a[l]]==)change(,,a[l],,n);}
while(r<que[i].r){r++;tk[a[r]]++;if(tk[a[r]]==)change(,,a[r],,n);}
while(r>que[i].r){tk[a[r]]--;if(tk[a[r]]==)change(,,a[r],,n);r--;}
ans[que[i].id]=t[].mi;
}
for(rint i=;i<=m;++i)
cout<<ans[i]<<endl;
return ;
}
最开始没设初始区间调了半个小时……
ps:此题需要卡常,最好使用奇偶性排序法QAQ(18000(TLE63)->12000(AC))
「题解」:[BZOJ4358]permu的更多相关文章
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 「题解」:[loj2763][JOI2013]现代豪宅
问题 A: 现代豪宅 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...
- 「题解」:$Six$
问题 A: Six 时间限制: 1 Sec 内存限制: 512 MB 题面 题面谢绝公开. 题解 来写一篇正经的题解. 每一个数对于答案的贡献与数本身无关,只与它包含了哪几个质因数有关. 所以考虑二 ...
- 「题解」:$Smooth$
问题 A: Smooth 时间限制: 1 Sec 内存限制: 512 MB 题面 题面谢绝公开. 题解 维护一个队列,开15个指针,对应前15个素数. 对于每一次添加数字,暴扫15个指针,将指针对应 ...
- 「题解」:Kill
问题 A: Kill 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 80%算法 赛时并没有想到正解,而是选择了另一种正确性较对的贪心验证. 对于每一个怪,我们定义它的 ...
- 「题解」:y
问题 B: y 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 考虑双向搜索. 定义$cal_{i,j,k}$表示当前已经搜索状态中是否存在长度为i,终点为j,搜索过边 ...
- 「题解」:x
问题 A: x 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 赛时想到了正解并且对拍了很久.对拍没挂,但是评测姬表示我w0了……一脸懵逼. 不难证明,如果对于两个数字 ...
随机推荐
- [kuangbin带你飞]专题一 简单搜索 - N - Find a way
正确代码: #include<iostream> #include<queue> #define N 210 #define inf 0xffffff using namesp ...
- 2019-2020 ICPC, NERC, Northern Eurasia Finals
A. Apprentice Learning Trajectory rdc乱编的做法 考虑贪心,每次会选择结束时间最早的. 设当前时间为 \(x\),那么可以区间有两类 a) \(l_i \leq x ...
- Java oop第05章_多态、接口
一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可 ...
- vue组件的props
刚开始学习vue组件的时候经常被 props这个传值搞晕,做个笔记 Vue.component('item', { template: '#item-template', props: { model ...
- ArcGIS Server 10.x查询管理用户名和修改管理员密码
在x:\Program Files\ArcGIS\Server\tools\passwordreset下有个bat文件,用管理员用户运行它. PasswordReset -l PasswordRese ...
- 关于 wpf 的ICommand 的 CanExecute CanExecuteChanged func action的认识
关于 wpf 的ICommand 的 CanExecute CanExecuteChanged func action的认识
- 阿里云图数据库GraphDB上线,助力图数据处理
GraphDB简介 GraphDB图数据库适用于存储,管理,查询复杂并且高度连接的数据,图库的结构特别适合发现大数据集下数据之间的共性和特性,特别善于释放蕴含在数据关系之间的巨大价值.GraphDB引 ...
- gitbook新版本"gitbook build"命令导出的html不能跳转的解决办法
使用的是win7系统,gitbook新版本不支持html跳转功能,所以要降版本至2.6.7 解决办法如下: 第一步: 生成时指定gitbook的版本, 本地没有会先下载 gitbook build - ...
- Eclipse MyBatis generator 1.3.7插件的核心包(中文注释)
一.最近刚搭建一个项目框架,使用springboot + mybatis,但是在使用Eclipse开发时发现开发mybatis的Dao.mapper.xml和entity时特别不方便,手工去写肯定是不 ...
- identifier of an instance of xx.entity was altered from xxKey@249e3cb2 to xxKey@74e8f4a3; nested exception is org.hibernate.HibernateException: identifier of an instance of xxentity was altered from错误
用entityManager保存数据时报错如下 identifier of an instance of xx.entity was altered from xxKey@249e3cb2 to xx ...