列表

详情


NC222087. 可爱

描述

可爱的牛妹为了检验牛牛的智力,给牛牛出了一道可爱的题。

给定一个长度为n的数列,数列的值是1,2,3...,n的一个排列。
小T会给出m个询问,每个询问形如"x y",表示询问包含了x,x+1,x+2,...,y-1,y的所有数字的最小区间。

输入描述

一共输入m+1行。
第一行输入两个数n,m,表示数列长度和询问次数。
第二行到第m+1行,每行输入三个整数x,y,表示询问包含x,x+1,...,y-1,y这段区间的最小区间。

输出描述

对于每一次询问,输出两个数l,r,表示从最小区间,中间用空格隔开,对于每次询问用换行隔开。

示例1

输入:

6 4
2 4 3 5 1 6
3 5 
4 6
1 2
2 6

输出:

2 4
2 6
1 5
1 6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 117ms, 内存消耗: 3320K, 提交时间: 2021-05-23 00:10:34

#include <stdio.h>
#include <algorithm>
#define MN 200000

int n,m,mn[MN*4+5],mx[MN*4+5];

void modify(int k,int l,int r,int p,int w){
	if(l==r){
		mn[k] = mx[k] = w;
		return;
	}
	int mid = (l+r)>>1;
	if(p<=mid) modify(k<<1,l,mid,p,w);
	else modify(k<<1|1,mid+1,r,p,w);
	mn[k] = std::min(mn[k<<1],mn[k<<1|1]);
	mx[k] = std::max(mx[k<<1],mx[k<<1|1]);
}

int qmin(int k,int l,int r,int L,int R){
	if(l==L&&r==R) return mn[k];
	int mid = (l+r)>>1;
	if(R<=mid) return qmin(k<<1,l,mid,L,R);
	if(L>mid) return qmin(k<<1|1,mid+1,r,L,R);
	return std::min(qmin(k<<1,l,mid,L,mid),qmin(k<<1|1,mid+1,r,mid+1,R));
}

int qmax(int k,int l,int r,int L,int R){
	if(l==L&&r==R) return mx[k];
	int mid = (l+r)>>1;
	if(R<=mid) return qmax(k<<1,l,mid,L,R);
	if(L>mid) return qmax(k<<1|1,mid+1,r,L,R);
	return std::max(qmax(k<<1,l,mid,L,mid),qmax(k<<1|1,mid+1,r,mid+1,R));
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int a;
		scanf("%d",&a);
		modify(1,1,n,a,i);
	}
	while(m--){
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d %d\n",qmin(1,1,n,l,r),qmax(1,1,n,l,r));
	}
}

上一题