洛谷P2880平衡的阵容题解

窝就是喜欢分块!!!

首先,为了凑字数,我先把题面copy过来

我的题库:https://blog.csdn.net/L_Y_T020321/article/details/83152606

题目背景

我就不copy英文题面了QwQ

题目描述:

每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <= 身高 <= 1,000,000). 他想知道每一组里面最高和最低的牛的身高差别.

输入:

第1行:N,Q

第2到N+1行:每头牛的身高

第N+2到N+Q+1行:两个整数A和B,表示从A到B的所有牛。(1<=A<=B<=N)

输出:

输出每行一个数,为最大数与最小数的差

一个农夫有N头牛,每头牛的高度不同,我们需要找出最高的牛和最低的牛的高度差。

输入输出格式

输入格式:

Line 1: Two space-separated integers, N and Q.

Lines 2…N+1: Line i+1 contains a single integer that is the height of cow i

Lines N+2…N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.

输出格式:

Lines 1…Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.

输入输出样例

输入样例#1:

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

输出样例#1:

6
3
0

首先,这道题有无数英雄豪杰用ST表过去了

然后,这道题的tag是树状数组,然而我却不会用树状数组A这道题QAQ

所以,用ST表跑过去之后,我就码了一个分块

分块赛高!!!

好了,我先放code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 100000
using namespace std ;
int tag_max[maxn] , tag_min[maxn] ;//记录块内最大最小
int n , m , a[maxn] ;
int N , pos[maxn] ;//块数以及块
int l[maxn] , r[maxn] ;//刚从别的地方学到的新技能--偷懒
int query_max(int x , int y ) {//区间求最大值
	int ans = -1000 ;
	if(pos[x] == pos[y]) {
		for(int i = x ; i <= y ; i ++) ans = max(ans , a[i]) ;//暴力
	}else {
		for(int i = x ; i <= r[pos[x]] ; i ++ ) ans = max(ans,a[i]) ;//左边
		for(int i = l[pos[y]] ; i <= y ; i ++) ans = max(ans ,a[i]) ;//右边
		for(int i = pos[x] + 1 ; i <= pos[y] - 1 ; i ++) ans = max(ans,tag_max[i]) ;//中间
	}
	return ans ;
}
int query_min(int x , int y ) {//区间求最小值
	int ans = 0x7ffffff ;
	if(pos[x] == pos[y]) {
		for(int i = x ; i <= y ; i ++) ans = min(ans , a[i]) ;
	}else {
		for(int i = x ; i <= r[pos[x]] ; i ++ ) ans = min(ans,a[i]) ;
		for(int i = l[pos[y]] ; i <= y ; i ++) ans = min(ans ,a[i]) ;
		for(int i = pos[x] + 1 ; i <= pos[y] - 1 ; i ++) ans = min(ans,tag_min[i]) ;
	}
	return ans ;
}
int main() { 
	memset(tag_min,0x3f,sizeof(tag_min)) ;
	memset(tag_max,-1,sizeof(tag_max)) ;
	scanf("%d%d",&n,&m) ;N = sqrt(n) ;
	for(int i = 1 ; i <= n ; i ++) {
		pos[i] = (i-1)/N + 1 ;
	}
	for(int i = 1 ; i <= n ; i ++) l[i] = (i-1) * N + 1 , r[i] = i * N ;
	for(int i = 1 ; i <= n ; i ++) {
		scanf("%d",&a[i]) ;
		tag_max[pos[i]] = max(tag_max[pos[i]],a[i]) ;
		tag_min[pos[i]] = min(tag_min[pos[i]],a[i]) ;
	}
	for(int i = 1 ; i <= m ; i ++) {
		int x , y ;
		scanf("%d%d",&x,&y) ;
		cout << query_max(x,y) - query_min(x,y) << endl ;
	}
	return 0 ;
}

本人的写法比较笨拙,是用两个query函数分别找出最大值和最小值来相减

当然,我萌也可以选择放到一个函数里


顺手把ST表的写法放上

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#define maxn 100010 
using namespace std ;
int f_max[maxn][40] , a , x , lc , n , m , p , len , l , r ;
int f_min[maxn][40] ;
int query_max(int l , int r) {
    
}
int main(){
    scanf("%d%d",&n,&m) ;
    for(int i = 1 ; i <= n ; i ++){
        scanf("%d",&a) ;
        f_max[i][0] = a ;
        f_min[i][0] = a ;
    } 
    lc = 1ll*(log(n)/log(2)) ;
    for(int j = 1 ; j <= lc ; j ++)
    for(int i = 1 ; i <= n - (1 << j) + 1 ; i ++)
    f_max[i][j] = max(f_max[i][j-1] , f_max[i+(1<<(j-1))][j-1]) ,
    f_min[i][j] = min(f_min[i][j-1] , f_min[i+(1<<(j-1))][j-1]) ;
    for(int i = 1 ; i <= m ; i ++){
        int x , y ;
        scanf("%d%d",&l,&r) ;
        p = 1ll*(log(r-l+1)/log(2)) ;
        x = max(f_max[l][p],f_max[r-(1<<p)+1][p]) ;
        y = min(f_min[l][p],f_min[r-(1<<p)+1][p]) ;
        cout << x - y <<endl ;
    } 
    return 0 ;
}

完结散花!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析指出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为中心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理中的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事指南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值