[BZOJ5319]军训列队 主席树+二分

本文详细解析了BZOJ5319问题的解决方案,通过将询问的人和位置排序,利用主席树进行区间查询,实现O((n+m)logk)的时间复杂度。介绍了如何通过二分查找确定大小关系变化的位置,并使用区间和计算最终答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[BZOJ5319]

  • 显然对于一个询问,我们应该将被询问的人以及询问的位置排序后一一匹配
  • 也就是排序后求 \sum=|Ai−Bi|
  • 由于人的位置互不相同,所以A数组是递增的,而B数组是连续的一段整数,因此Ai与Bi的大小关系只有可能由小于到大于变化一次
  • 对原序列建立主席树,询问时在对应区间上二分出大小关系变化的位置,前后用区间和计算答案即可
  • 时间复杂度O((n+m)logk)

Code

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int inf=1e6;
const int N=5e5+10;
int lc[N*21],rc[N*21],cnt[N*21],root[N],tot,l,r,k,n,m;
ll sum[N*21];
inline int read(){
	int num=0;char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))num=num*10+ch-'0',ch=getchar();
	return num;
}
inline ll print(ll x){if(x>9)print(x/10);putchar(x%10+'0');}
void update(int &o,int last,int L,int R,int val){
	int M=L+R>>1;
	o=++tot,lc[o]=lc[last],rc[o]=rc[last],sum[o]=sum[last]+val,cnt[o]=cnt[last]+1;
	if(L==R)return;
	if(val<=M)update(lc[o],lc[last],L,M,val);
	else update(rc[o],rc[last],M+1,R,val);
}
inline ll cal(int k,int cnt){return 1LL*(k+k+cnt-1)*cnt/2;}
ll query(int now,int last,int L,int R,int k){
	int M=L+R>>1;
	int CNT=cnt[now]-cnt[last];
	ll SUM=sum[now]-sum[last];
	if(CNT==0)return 0;
	if (L>=k) return SUM-cal(k,CNT);
	if (R<=k) return cal(k,CNT)-SUM;
	int tmp=cnt[lc[now]]-cnt[lc[last]];
	return query(lc[now],lc[last],L,M,k)+query(rc[now],rc[last],M+1,R,k+tmp);
}
int main()
{
	//freopen("a.in","r",stdin);
	n=read(),m=read();
	rep(i,1,n){
		k=read();
		update(root[i],root[i-1],1,inf,k);
	}
	while(m--){
		l=read(),r=read(),k=read();
		print(query(root[r],root[l-1],1,inf,k));
		puts("");
	}return 0;
}

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值