爱线段树的好孩子【九校2D1T3】优美序列

2023-10-27

Lxy养了N头奶牛,他把N头奶牛用1..N编号,第i头奶牛编号为i。为了让奶牛多产奶,每天早上他都会让奶牛们排成一排做早操。奶牛们是随机排列的。在奶牛排列中,如果一段区间[L,R]中的数从小到大排列后是连续的,他认为这段区间是优美的。比如奶牛排列为:(3, 1, 7, 5, 6, 4, 2),区间[3,6]是优美的,它包含4,5,6,7连续的四个数,而区间[1,3] 是不优美的。Lxy的问题是:对于给定的一个区间[L,R](1<=L<=R<=N), 他想知道,包含区间[L,R]的最短优美区间,比如区间[1,3]的最短优美区间是[1,7]。 

数据随机说明优美区间并不多

预处理出来

然后离线操作

线段树维护到当前点最短的符合条件的区间

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
inline void read(int &x){
	x=0;
	int f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
const int N=1e5+100;
const int INF=1e9+7;
struct Segment_Tree{
	int val[N];
	struct Node{
		int lson,rson,Mx,Mn;
	}T[N<<2];
	inline void PushUp(int p){
//		T[p].Mx=max(T[lc].Mx,T[rc].Mx);
		T[p].Mn=min(T[lc].Mn,T[rc].Mn);
	}
	inline void Build(int p,int l,int r){
		T[p].lson=l;
		T[p].rson=r;
		if(l==r){
			T[p].Mn=T[p].Mx=val[l];
			return;
		}
		int mid=(l+r)>>1;
		Build(lc,l,mid);
		Build(rc,mid+1,r);
		PushUp(p);
	}
	inline void Update(int p,int pos,int val){
		if(T[p].lson==T[p].rson){
			T[p].Mn=min(T[p].Mn,val);
//			T[p].Mx=max(T[p].Mx,val);
			return;
		}
		int mid=(T[p].lson+T[p].rson)>>1;
		if(pos<=mid)Update(lc,pos,val);
		else Update(rc,pos,val);
		PushUp(p);
	}
	inline int QueryMn(int p,int l,int r){
		if(l<=T[p].lson&&T[p].rson<=r){
			return T[p].Mn;
		}
		int mid=(T[p].lson+T[p].rson)>>1;
		int ret=INF;
		if(l<=mid)ret=min(ret,QueryMn(lc,l,r));
		if(mid< r)ret=min(ret,QueryMn(rc,l,r));
		return ret;
	}
	inline int QueryMx(int p,int l,int r){
		if(l<=T[p].lson&&T[p].rson<=r){
			return T[p].Mx;
		}
		int mid=(T[p].lson+T[p].rson)>>1;
		int ret=-INF;
		if(l<=mid)ret=max(ret,QueryMx(lc,l,r));
		if(mid< r)ret=max(ret,QueryMx(rc,l,r));
		return ret;
	} 
}Tree;
int n,m;
struct ST_map{
	int val[N];
	int Mx[21][N];
	int Mn[21][N];
	void Build(){
		for(int i=1;i<=n;++i){
			Mx[0][i]=Mn[0][i]=val[i];
		}
		for(int i=1;i<=20;++i){
			for(int j=1;j<=n;++j){
				if(j+(1<<(i-1))>n)continue;
				Mx[i][j]=max(Mx[i-1][j],Mx[i-1][j+(1<<(i-1))]);
				Mn[i][j]=min(Mn[i-1][j],Mn[i-1][j+(1<<(i-1))]);
			}
		}
	}
	int QueryMx(int l,int r){
		int k=log2((double)(r-l+1));
		return max(Mx[k][l],Mx[k][r-(1<<k)+1]);
	}
	int QueryMn(int l,int r){
		int k=log2((double)(r-l+1));
		return min(Mn[k][l],Mn[k][r-(1<<k)+1]);
	}
}Sum,Loc;
struct Query{
	int l,r,Id;
}A[N];
bool cmp(Query A,Query B){
	return A.l<B.l;
}
int ans[N][2];
int F[N];
void Check(int v){
	int Mx=-INF;
	int Mn=INF;
	for(int i=v;i<=n;++i){
		Mx=max(Mx,Sum.val[i]);
		Mn=min(Mn,Sum.val[i]);
		if(Loc.QueryMn(Mn,Mx)<v)break;
		if(i-v==Mx-Mn){
			Tree.Update(1,i,i-v+1);
			F[i-v+1]=v;
		}
	}
}
int main(){
//	freopen("sequence.in","r",stdin);
//	freopen("sequence.out","w",stdout);
	read(n);
	for(int i=1;i<=n;++i){
		read(Sum.val[i]);
		Loc.val[Sum.val[i]]=i;
		Tree.val[i]=INF;
	}
	read(m);
	Sum.Build();
	Loc.Build();
	for(int i=1;i<=m;++i){
		read(A[i].l);
		read(A[i].r);
		A[i].Id=i;
	}
	sort(A+1,A+1+m,cmp);
	int now=1;
	Tree.Build(1,1,n);
	for(int i=1;i<=m;++i){
		while(now<=n&&now<=A[i].l){
			Check(now);
			++now;
		}
		int len=Tree.QueryMn(1,A[i].r,n);
		ans[A[i].Id][0]=F[len];
		ans[A[i].Id][1]=ans[A[i].Id][0]+len-1;
	}
	for(int i=1;i<=m;++i){
		cout<<ans[i][0]<<" "<<ans[i][1]<<'\n'; 
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爱线段树的好孩子【九校2D1T3】优美序列 的相关文章

  • 尚硅谷_vue核心基础部分

    01 初始vue 1 想让vue工作 就必须创建一个Vue实例 且要传入一个配置对象 2 root容器里的代码依然符合html规范 只不过混入了一些特殊的Vue语法 3 root容器里的代码被称为 Vue模板 4 Vue实例和容器是一一对应

随机推荐

  • crmeb 标准版Window+phpstudy8安装教程(一)

    标准版Window phpstudy8安装教程 一 安装前配置 nginx mysql php7 3 4 一 安装集成环境 这里以phpstudy为例 下载PHPstudy8 0安装 记录安装的位置 D phpstudy pro 二 准备源
  • 阿里云修复 polkit pkexec 本地提权漏洞(CVE-2021-4034)

    该漏洞EXP已公开传播 漏洞利用成本极低 建议您立即关注并修复 如何修复呢 解决建议 1 无法升级软件修复包的 可使用以下命令删除pkexec的SUID bit权限来规避漏洞风险 chmod 0755 usr bin pkexec 示例 l
  • maven野生仓库

    mvnrepository com
  • 洛谷借教室

    之前写过 再过一遍其实不会 题目描述 在大学期间 经常需要租借教室 大到院系举办活动 小到学习小组自习讨论 都需要向学校申请借教室 教室的大小功能不同 借教室人的身份不同 借教室的手续也不一样 面对海量租借教室的信息 我们自然希望编程解决这
  • linux服务器桌面卡死,linux服务器显卡崩溃解决方案

    在登录界面出现分辨率特别大 整个图形界面特别大 并且怎么也登录不上去的情况时 对于这种情况 一般就是显卡驱动崩了的原因 所以我们可以首先检查显卡驱动是否有问题 nvidia smi 如果出现说驱动链接不上什么的问题 就是说明你的显卡驱动出现
  • 九、Linux系统编程:线程池编程

    9 线程池编程 创建线程要花费昂贵的资源和时间 如果任务来了才创建线程那么响应时间会变长 而且一个进程能创建的线程数有限 为了避免这些问题 在程序启动的时候就创建若干线程来响应处理 它们被称为线程池 里面的线程叫工作线程 9 1 概念 线程
  • sql-lab (32~35)包含对 宽字节注入的原理理解及注意事项(后持续更新)

    32 35 包含对 宽字节注入的原理理解及注意事项 sql lab 32 我们先对32关进行一个传参 发现 1 and 1 2 在这里 代表的意思是 转义 把后面的 转义成了字符串 使单引号不再具有 作用 仅仅是 内容 而已 或者说这个单引
  • Intellijidea建javaWeb以及Servlet简单实现

    一 创建并设置javaweb工程 1 创建javaweb工程 File gt New gt Project 点击Project后出现如下界面 选择Java Enterprise 选中下图圈中部分 点击Next后弹出下图弹出框 设置工程名字
  • 深度学习环境搭建(三)之 CUDA安装

    安装完CUDA Driver后 就可以安装CUDA了 因为项目需要 这里安装的CUDA 11 4版本 下载CUDA 访问CUDA Toolkit官网 找到要下载的版本 如果驱动已经安装 不要选驱动 配置CUDA环境 打开用户配置文件 sud
  • Java中重载(overload)与重写(override)

    重载 overload 在一个类中 同名的方法如果有不同的参数列表 参数类型不同 参数个数不同 参数顺序不同 则视为重载 同时重载对返回类型没有要求 可以相同也可以不同 重载是一个类中多态性的一种表现 Java中的重载就是在类中可以创建多个
  • 测试理论/测试基础知识-详细版

    测试理论 目录 1 外部质量模型 2 瀑布型软件生命周期 3 测试的含义 4 测试方法 5 测试四个活动 6 测试阶段 7 系统测试类型 8 测试活动 9 测试用例的组成 10 缺陷管理 11 需求管理 12 需求评审 13 需求跟踪 14
  • 10和25的最大公约数python_用Python求两个数最大公约数的方法

    用Python求两个数最大公约数的方法 发布时间 2020 04 29 11 45 47 来源 亿速云 阅读 156 作者 小新 这篇文章主要介绍了用Python求两个数最大公约数的方法 具有一定借鉴价值 需要的朋友可以参考下 下面就和我一
  • 海德汉编程详细手册_海德汉系统加工模式选择显示界面开发

    海德汉数控系统加工模式选择循环Cycle332提供四种不同加工模式组 这四种加工模式组分别是 标准加工模式 standard 精加工模式 exact 光滑表面加工模式 smooth 粗加工模式 rough OEM厂家可根据机床性能以及最终用
  • 三维管廊大规模实时渲染方案

    随着 WebBIM 和3D GIS技术的大力发展 建筑模型的复杂度与构件数量呈几何倍数增长 其中管廊复杂网格是影响模型轻量化和在线渲染速率的一个关键性问题 为有效减少管廊复杂网格模型的数据量及复杂度 本文针对一般圆柱体形管廊 复杂网格的弯管
  • matlab读取usb口,matlab控制串口/usb 进行设备通讯

    m文件代码 s serial COM4 设置为实际使用的串口号即可 get s Name Port Type s ReadAsyncMode continuous fopen s fprintf s idn 发送给测试仪的读取命令 out
  • 测试开发是什么?什么是测试开发工程师?

    测试开发工程师 Software Development Engineer in Test 简称SDET 是指那些既可以称作是开发人员 同时也负责软件开发阶段和测试周期的测试工作的技术人员 一个专业的SDET更关注软件产品的可测性 稳健性和
  • QML 保存用户配置

    作者 一去 二三里 个人微信号 iwaleon 微信公众号 高效程序员 对于应用程序来说 数据存储是不可或缺的一部分 例如 我们通常需要将用户的偏好设置 应用程序配置等信息保存起来 这样即使程序关闭或设备重启 数据也会得到保留 很方便后续继
  • 吞吐量 (TPS)、每秒查询率 (QPS)、并发数、响应时间 (RT),PV (Page View),UV (Unique Visitor),DAU (Daily Active User),MAU等

    吞吐量 TPS TPS Transactions Per Second 吞吐量是指系统在单位时间内处理请求的数量 对于无并发的应用系统而言 吞吐量与响应时间成严格的反比关系 实际上此时吞吐量就是响应时间的倒数 前面已经说过 对于单用户的系统
  • C++学习(六十二)整型初始化

    Debug模式下 未初始化的变量值为0xCCCCCCCC 即 858983460
  • 爱线段树的好孩子【九校2D1T3】优美序列

    Lxy养了N头奶牛 他把N头奶牛用1 N编号 第i头奶牛编号为i 为了让奶牛多产奶 每天早上他都会让奶牛们排成一排做早操 奶牛们是随机排列的 在奶牛排列中 如果一段区间 L R 中的数从小到大排列后是连续的 他认为这段区间是优美的 比如奶牛