Gym 102091A: Flying Squirrel(RMQ)

题意:如图,有N个柱子,每次我可以从高柱子X到低柱子Y,而且需要满足中间的柱子都小于X的高度。
思路:现在有Q次询问,每次给定(X,Y),(如果ht[X]<ht[Y],则交换XY),问X为起点,Y为终点的最长路径。 如果Y为0,你可以选择任一点为终点。
每次我们把当前dfs的区间最高的几个柱子(假设高度为H)抽出来,它们把当前区间划分为了几个小区间,可以把这些高的柱子看成根,那么被夹在中间的区间就是子树,再去dfs深入中间的区间即可。 最后假如要从X到Y,如果它们之间没有更高的,答案就是深度差。
由于每个柱子只被当成一次根,所的复杂度是O(N)的,加上RMQ找区间最大值,总的时间是O(NlogN)的。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int h[maxn],dep[maxn],ans[maxn];
int mx[][maxn],Log[maxn];
int Max(int a,int b){ return h[a]>=h[b]?a:b;}
int find(int L,int R)
{
int k=Log[R-L+];
return Max(mx[k][L],mx[k][R-(<<k)+]);
}
int solve(int L,int R,int d)
{
if(L>R) return -;
int p=find(L,R); dep[p]=d;
ans[p]=solve(L,p-,d+)+;
int res=ans[p];
while(p<R){
int q=find(p+,R);
if(h[q]!=h[p]) break;
dep[q]=d;
int t=solve(p+,q-,d+)+;
res=max(res,t);
ans[p]=max(ans[p],t);
ans[q]=t;
p=q;
}
ans[p]=max(ans[p],solve(p+,R,d+)+);
res=max(res,ans[p]);
return res;
}
int main()
{
int N,M,L,R;
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%d",&h[i]);
Log[]=-;
rep(i,,N) Log[i]=Log[i>>]+;
rep(i,,N) mx[][i]=i;
for(int i=;(<<i)<=N;i++)
for(int j=;j+(<<i)-<=N;j++)
mx[i][j]=Max(mx[i-][j],mx[i-][j+(<<(i-))]);
solve(,N,);
rep(i,,M){
scanf("%d%d",&L,&R);
if(h[L]<h[R]) swap(L,R);
if(!R) printf("%d\n",ans[L]);
else {
if(L==R) puts("");
else {
int p;
if(L<R) p=find(L+,R);
else p=find(R,L-);
if(h[p]>=h[L]) puts("");
else printf("%d\n",dep[R]-dep[L]);
}
}
}
return ;
}
Gym 102091A: Flying Squirrel(RMQ)的更多相关文章
- Gym - 100513B:Colored Blankets (构造)(存疑)
题意:给定N的棒棒,K种颜色,每个棒棒的两端可以涂色.现在已知所有的线段要么有一端涂色,要么两端都没有涂色,现在要求把所有的没涂色的部分涂色,使得我们可以把涂色后的棒棒分为N/K组,每组的涂色情况相同 ...
- ST(RMQ)算法(在线)求LCA
在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法 ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。
一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...
- 从零开始学Python第一周:Python基础(上)
Python语法基础(上) 一,Python的变量 (1)创建变量 变量的含义:存储信息的地方 创建变量并赋值 x = 1 print x x = 123 #再次赋值 print x (2)使用变量 ...
- OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持
本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
随机推荐
- python删除指定路径的文件
import os import glob path =imgDate_listResult for infi ...
- FFmpeg点播慢的最终方案
转载: 音视频交流群 发的一个总结. 原作者 请查看相关博客作者 http://blog.51cto.com/fengyuzaitu/2061036 场景要求 项目要求点播速度是300到500毫秒 ...
- python ctrl+c
#!/usr/bin/env pythonimport signalimport sysimport osdef signal_handler(signal, frame): print('You p ...
- Ubuntu上安装MySQL
Ubuntu上安装MySQL非常简单只需要几条命令就可以完成.`````` sudo apt-get update sudo apt-get install mysql-server 会弹出提示,让输 ...
- linux下vmstat命令详解
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控. 它能够对系统的整体情况进行统计,无法对某个进程进行深入分析 ...
- Win10系列:VC++绘制几何图形4
三角形绘制完成以后,接下来介绍如何给项目添加主入口函数.打开D2DBasicAnimation.h头文件,添加如下的代码定义一个DirectXAppSource类. //定义类DirectXAppSo ...
- MATLAB 图片折腾4
重新安排矩阵的x,y,z , 在二维中就相当于把x,y 对换,在三维中相当于可以把三个坐标的位置互换. 比如A = A(:,:,1)=repmat(1,3,3);A(:,:,2)=repmat(2,3 ...
- div 内 图片 垂直居中
vertical-align属性适用于 line-block: <div class="title"> <img src="img_p1_title.p ...
- 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)
Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...
- L259 合同
We are satisfied with the terms of this contract for the most part, but we feel that your terms of p ...